我有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
SELECT
ID
,LATITUDE
,LONGITUDE
FROM LOCATION
我想检查区域内是否有位置(即纬度和经度坐标)。区域表具有列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, Nullable1 z, Nullable
1 m)at Microsoft.SqlServer.Types.ForwardingGeoDataSink.BeginFigure(Double x, 双y,Nullable1 z, Nullable
1 m)at Microsoft.SqlServer.Types.CoordinateReversingGeoDataSink.BeginFigure(双人间 x,Double y,Nullable1 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表。
答案 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