【发布时间】:2017-09-08 04:48:03
【问题描述】:
我有 2 张桌子(区域和位置),我想检查一张桌子的经纬度坐标是否存在于另一张桌子的区域中。
表名:AREA
列:
OBJECTID (int),
区域名称(varchar(50)),
GEOM(几何)
表名:LOCATION 列: ID(整数), 纬度(varchar(50)), 经度 (varchar(50))
Area 表中的样本数据:
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
完整的错误信息:
消息 6522,级别 16,状态 1,行 70 发生 .NET Framework 错误 在执行用户定义的例程或聚合“地理”期间: System.FormatException: 24201: 纬度值必须介于 -90 和 90 度。 System.FormatException:在 Microsoft.SqlServer.Types.GeographyValidator.ValidatePoint(双 x, 双 y, Nullable
1 z, Nullable1 m) at Microsoft.SqlServer.Types.Validator.BeginFigure(双 x,双 y, 可空1 z, Nullable1 m) 在 Microsoft.SqlServer.Types.ForwardingGeoDataSink.BeginFigure(双 x, 双 y, Nullable1 z, Nullable1 m) at Microsoft.SqlServer.Types.CoordinateReversingGeoDataSink.BeginFigure(双 x, 双 y, Nullable1 z, Nullable1 m) 在 Microsoft.SqlServer.Types.WellKnownTextReader.ParseLineStringText()
在 Microsoft.SqlServer.Types.WellKnownTextReader.ParsePolygonText()
在 Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType 类型)在 Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType 类型, Int32 srid) 在 Microsoft.SqlServer.Types.SqlGeography.ParseText(OpenGisType 类型, SqlChars 标记文本,Int32 srid)在 Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType 类型,SqlChars taggedText,Int32 srid)。
我是这个 sql server 空间数据的新手。有人可以指导我完成这项任务吗?谢谢! :)
20170414 更新:Here 是我将经纬坐标转换为几何后来自 AREA & LOCATION 表的示例数据。
【问题讨论】:
标签: sql sql-server geometry spatial geography