如何在SQL Server 2012 Spatial表中将列从Geometry转换为Geography?

时间:2017-04-12 12:01:09

标签: sql sql-server geometry spatial geography

我有2张桌子(区域和位置),我想查看lat& amp;一张表中的长坐标与另一张表的区域一起出现。

表名:AREA 列: OBJECTID(int),
AREA_NAME(varchar(50)), GEOM(几何

表名:LOCATION 列: ID(int), LATITUDE(varchar(50)), LONGITUDE(varchar(50))

区域表中的样本数据:

SELECT OBJECTID
,AREA
,GEOM
,GEOM.STAsText() 
FROM AREA

AREA TABLE

SELECT 
ID
,LATITUDE 
,LONGITUDE  
FROM LOCATION

LOCATION TABLE

我想检查区域内是否有位置(即纬度和经度坐标)。区域表具有列GEOMETRY列。 所以我想将此几何列转换为地理列。一旦我转换为地理位置,我就可以使用STIntersects()检查位置是否在该区域内。

但是当我尝试转换时,我得到一个错误,因为纬度值必须在-90到90度之间。

SELECT GEOGRAPHY::STGeomFromText(CAST(GEOM AS VARCHAR(MAX)), 4326) FROM AREA

完整错误消息:

  

Msg 6522,Level 16,State 1,Line 70发生了.NET Framework错误   在执行用户定义的例程或聚合"地理":   System.FormatException:24201:纬度值必须介于-90和之间   90度。 System.FormatException:at   Microsoft.SqlServer.Types.GeographyValidator.ValidatePoint(Double x,   双y,Nullable 1 z, Nullable 1 m)at   Microsoft.SqlServer.Types.Validator.BeginFigure(Double x,Double y,   Nullable 1 z, Nullable 1 m)at   Microsoft.SqlServer.Types.ForwardingGeoDataSink.BeginFigure(Double x,   双y,Nullable 1 z, Nullable 1 m)at   Microsoft.SqlServer.Types.CoordinateReversingGeoDataSink.BeginFigure(双人间   x,Double y,Nullable 1 z, Nullable 1 m)at   Microsoft.SqlServer.Types.WellKnownTextReader.ParseLineStringText()
  在Microsoft.SqlServer.Types.WellKnownTextReader.ParsePolygonText()
  在   Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType   输入)   Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType类型,   Int32 srid)at   Microsoft.SqlServer.Types.SqlGeography.ParseText(OpenGisType类型,   SqlChars taggedText,Int32 srid)at   Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType   type,SqlChars taggedText,Int32 srid)。

我是这个sql server空间数据的新手。有人可以指导我完成这项任务吗?谢谢! :)

20170414更新:Here是来自AREA&的样本数据。将lat& long坐标转换为Geometry后的LOCATION表。

1 个答案:

答案 0 :(得分:0)

您的区域似乎是在网络墨卡托坐标中,而不是纬度和经度。 在墨卡托中,坐标以(0,0)为单位计算,而不是度数。

尝试将lat lon转换为web mercator,然后使用新坐标

创建几何点

这是代码exapmle(JS):

var degrees2meters = function(lon,lat) {
        var x = lon * 20037508.34 / 180;
        var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
        y = y * 20037508.34 / 180;
        return [x, y]
}

x= -77.035974
y = 38.898717

console.log(degrees2meters(x,y))

// should result in: -8575605.398444, 4707174.018280

https://gist.github.com/springmeyer/871897