2013-04-02 2 views
8

Ho bisogno di geocodificare un gran numero di indirizzi, usando il servizio Bing Map, EF 5 e SQL Server 2008. Sto usando il tipo di dati geografici in SQL, che si traduce in un tipo DbGeography da EF.coordinateSystemId su DbGeography

Quando creo un oggetto DbGeography, come questo

string point = string.Format("POINT({0} {1})",address.Longitude,address.Latitude); 
address.Location = System.Data.Spatial.DbGeography.PointFromText(point, 4326); 

Il secondo parametro chiede un "coordinateSystemId". Cos'è esattamente questo? Molti esempi che vedo usano 4326. Sono nuovo ai dati spaziali, ma immagino ci sia un insieme di sistemi di coordinate ben definiti? Non riesco a trovare una definizione.

risposta

9

C'è un intero StackExchange per GIS, e se, come me, incespicare in lì come un codificatore non sapendo GIS, siete dentro per un giro:

https://gis.stackexchange.com/questions/48949/epsg-3857-or-4326-for-googlemaps-openstreetmap-and-leaflet

si scopre c'è uno standard per la mappatura ("GIS") chiamato EPSG, e la gente sembra di usare "EPSG," " EPSG SRID "e" SRID "in modo intercambiabile quando ci si riferisce ad esso. Nella maggior parte delle piattaforme GPS, se stai parlando di Earth (inclusi LatLngs che ricevi da Google Maps), stai utilizzando EPSG SRID 4326 e, se stai parlando di una mappa 2D piatta (come una mappa personalizzata di Google) , stai parlando di EPSG SRID 3857.

C'è anche qualche malarkey su WGS che puoi ignorare.

.Net sta cercando solo l'ID numerico effettivo nell'SPLID EPSG. Sarebbe super disponibile, se queste erano solo le costanti su DbGeography come:

public class DbGeography 
{  
    public const int SridGps = 4326; 
    public const int Srid2dPlane = 3857; 

ma nessuna tale fortuna.

In ogni caso, considera di renderle costanti nella tua applicazione piuttosto che gettare un numero magico non documentato. La nostra piccola classe di supporto:

public class GeoHelper 
{ 
    public const int SridGoogleMaps = 4326; 
    public const int SridCustomMap = 3857; 



    public static DbGeography FromLatLng(double lat, double lng) 
    { 
     // http://codepaste.net/73hssg 
     return DbGeography.PointFromText(
      "POINT(" 
      + lng.ToString() + " " 
      + lat.ToString() + ")", 
      SridGoogleMaps); 
    } 
}