从纬度和经度字段创建几何/地理字段(SQL Server)

9
我有一个视图,包含纬度和经度两个字段,希望创建一个新的视图将这些lat/lon字段转换为几何/地理字段(不确定哪种最适合ArcGIS)。原始视图中的字段类型为double,我希望在新的视图中将它们转换为空间类型。
目前我不知道如何将这些字段转换为空间类型。所有其他类似的问题都没有给我一个可行的解决方案,所以如果这个问题看起来像是重复的,我很抱歉,但希望一个更清晰的例子也能帮助其他人。
我的新视图写得非常简单-
SELECT * FROM view_name WHERE (latitude <> 0) AND (longitude <> 0)

我该如何基于现有视图创建这个新视图,并将这两个字段转换为空间类型(或创建一个新的空间字段并填充lat/lon值)?

我正在使用SQL Server Management Studio 2012版。如果我漏掉了任何重要信息,请告诉我。我很乐意提供尽可能多的细节。


我为你谷歌了一篇文章,这似乎有很多关于你需要的信息: http://www.sql-server-helper.com/sql-server-2008/convert-latitude-longitude-to-geography-point.aspx - Kris B
我已经找到了那篇文章。它似乎有我需要的信息,但是它是针对2008年的,而且是关于表格创建的。我特别需要2012年的视图创建。谢谢。 - csterling
2个回答

23
  SELECT  *, 
          geography::STGeomFromText('POINT(' + 
                CAST([Longitude] AS VARCHAR(20)) + ' ' + 
                CAST([Latitude] AS VARCHAR(20)) + ')', 4326) as GEOM,

          geography::Point([Latitude], [Longitude], 4326) as SAME_GEOM

  FROM view_name 
  WHERE (latitude <> 0) AND (longitude <> 0)

1
提醒一下,这是正确的,但取决于您对纬度/经度的数据类型和精度,这可能会导致问题。如果纬度/经度存储为浮点数,则将其转换为varchar将截断小数位,因此点将略有不同。将其转换为更高精度的十进制数,然后再转换为varchar将解决此问题。 - hcaelxxam
@hcaelxxam 当我试图实现那段代码时,我收到了这个SQL执行错误-http://imgur.com/DQifNJN视图中的列确实被创建了,但是它们的值看起来像这样-http://imgur.com/ObOTDbR我完全复制了您的示例代码,并仅将view_name占位符替换为实际视图。错误显示纬度值必须在-90和90度之间。我翻转了POINT args中的lat / lon字段名称,以为可能是lat / lon被颠倒了,但我仍然得到相同的错误。我现在将搜索错误24201。 - csterling
2
@csterling,在GEOGRAPHY::POINT()中,顺序为(纬度,经度),在GEOGRAPHY::STGeomFromText('POINT()')中,顺序为(经度,纬度)。如果运行查询“SELECT MIN(latitude), MAX(latitude), MIN(longitude), MAX(longitude) FROM view_name”,你会得到什么结果?如果你的点是从0到360而不是十进制度数,你可能会遇到一些问题。 - hcaelxxam
@csterling,我再仔细看一下,你可能会有更多的问题。你的最小纬度大约与最小经度相同。你可能会混淆纬度/经度。 - hcaelxxam
@csterling,非常有趣。如果您将查询更改为SELECT TOP 1,它是否有效?如果是这样,请尝试增加记录数,直到查询失败(1000=好,2000=好,3000=坏,2500=好,2750=坏...2524=坏),并查看在哪些值处失败。但如果这样不起作用,请检查您是否已经交换了经度/纬度。如果您在纬度位置输入经度,则会得到-90->90之外的值。 - hcaelxxam
显示剩余6条评论

9

Juan的回答让我找到了正确的方向。在处理几何图形时,我最初使用的是

geometry::Point([Latitude], [Longitude], 4326) as Geom

但当我尝试使用 Geom.STX 来获取经度时,它返回的是纬度值。而 Geom.STY 实际上返回的是经度值。

我不得不使用

geometry::Point([Longitude], [Latitude], 4326) as Geom

我只是想为遇到几何类型问题的其他人提供此解决方案。


为什么不使用地理类型而是使用几何类型呢?正如Jaun Carlos Oropeza的回答中所描述的那样,构造方法"geography::Point"按照纬度和经度的顺序接受参数。然后,可以使用对象的.Lat和.Long属性来检索这两个值。我的参考链接是:https://learn.microsoft.com/en-us/dotnet/api/microsoft.sqlserver.types.sqlgeography?view=sql-dacfx-161 - undefined

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