coordinateSystemId on DbGeography

12

我需要使用Bing地图服务、EF 5和SQL Server 2008对大量地址进行地理编码。我在SQL中使用地理数据类型,这将被EF转换为DbGeography类型。

当我像这样创建一个DbGeography对象时:

string point = string.Format("POINT({0} {1})",address.Longitude,address.Latitude);
address.Location = System.Data.Spatial.DbGeography.PointFromText(point, 4326);
第二个参数要求提供一个“coordinateSystemId”(坐标系统标识符)。这是什么意思?我看到很多例子都使用4326。由于我对空间数据很陌生,我猜想是否存在一组明确定义的坐标系统?但我似乎找不到定义。
2个回答

15

有一个专门的GIS StackExchange,如果你像我一样,以编码人员的身份进入那里并不了解GIS,那么你将会有所收获:

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

原来在地图制作(“GIS”)中有一个称为EPSG的标准,人们在提及时似乎可以互换使用“EPSG”、“EPSG SRID”和“SRID”。在大多数GPS坐标用法中,如果你谈论的是地球(包括从Google Maps获取的LatLngs),那么你正在使用EPSG SRID 4326,如果你谈论一个平面2D地图(如Google Custom Map),那么你正在谈论EPSG SRID 3857。

还有一些关于WGS的胡言乱语可以忽略。

.Net只查找EPSG SRID中的实际数字ID。如果这些仅是DbGeography上的常量,那将非常有帮助:

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

不过没有这样的好运。

无论如何,考虑将它们作为常量在你的应用程序中使用,而不仅仅是随意使用未经记录的神奇数字。我们的小助手类:

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);
    }
}

4
SRID 4326有一个常数:DbGeography.DefaultCoordinateSystemId,文档中描述为“地理值(WGS 84)的默认坐标系统id(SRID)”。 - 0xced
1
不错,这是在 .Net 4.5 中新增的 - 绝对有帮助。 - Chris Moschini
System.Data.Spatial.DbGeography 在 .NET Core 中不可用。 - Ian Kemp

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接