【问题标题】:How to convert a column from Geometry to Geography in SQL Server 2012 Spatial table?如何在 SQL Server 2012 空间表中将列从几何转换为地理?
【发布时间】: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, Nullable1 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


    【解决方案1】:

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

    尝试将纬度转换为网络墨卡托,然后使用新坐标创建几何点,

    这里是代码示例(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

    【讨论】:

    • 我已将纬度和经度点转换为几何形状,然后尝试检查该区域是否包含经度和经度点。但我没有得到任何结果。 Here 是来自区域和位置的示例数据。当我查看 POINT & POLYGON 数据时,多边形区域不包含这些点。我如何将纬度和经度点转换为几何图形有什么问题吗?
    • 您尝试解决方案#2 吗?在转换为 georgaphy 之前,将 area 列与多边形相交。
    • 我不知道如何做#2。
    • 我已经完全重写了我的答案
    猜你喜欢
    • 2013-04-18
    • 2010-09-21
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多