从Latitude&;创建几何/地理字段;经度字段(SQL Server)
我有一个包含两个纬度和经度字段的视图,我想创建一个新视图,将这些纬度/经度字段转换为几何/地理字段(不确定哪一个最适合ArcGIS)。原始视图中的字段是双重类型,我希望它们在新视图中转换为空间类型 目前我不确定如何将这些字段强制转换为空间类型。关于堆栈溢出的所有其他类似问题都没有给我一个有效的解决方案,所以如果这个问题看起来是重复的,我很抱歉,但希望一个更清晰的例子也能帮助其他人 我的新观点写得很简单-从Latitude&;创建几何/地理字段;经度字段(SQL Server),sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个包含两个纬度和经度字段的视图,我想创建一个新视图,将这些纬度/经度字段转换为几何/地理字段(不确定哪一个最适合ArcGIS)。原始视图中的字段是双重类型,我希望它们在新视图中转换为空间类型 目前我不确定如何将这些字段强制转换为空间类型。关于堆栈溢出的所有其他类似问题都没有给我一个有效的解决方案,所以如果这个问题看起来是重复的,我很抱歉,但希望一个更清晰的例子也能帮助其他人 我的新观点写得很简单- SELECT * FROM view_name WHERE (latitude <&g
SELECT * FROM view_name WHERE (latitude <> 0) AND (longitude <> 0)
从视图中选择*名称,其中(纬度0)和(经度0)
如何基于现有视图创建此新视图,并将这两个字段(或创建一个用lat/lon值填充的新空间字段)转换为空间类型
我正在使用SQLServerManagementStudio,2012版。如果我遗漏了任何相关信息,请告诉我。我很乐意提供尽可能多的详细信息。SELECT*,
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)
地理::stgeomefromtext('POINT('+
将([经度]转换为VARCHAR(20))+“”
将([纬度]转换为VARCHAR(20))+'”,将4326)转换为GEOM,
地理:点([纬度],[经度],4326)与地理相同
从视图\u名称
其中(纬度0)和(经度0)
胡安的回答让我走上了正确的道路。在处理我最初使用的几何图形时
geometry::Point([Latitude], [Longitude], 4326) as Geom
但是当我尝试使用Geom.STX访问经度时,它会返回纬度值。而Geom.STY实际上会返回经度值
我不得不使用
geometry::Point([Longitude], [Latitude], 4326) as Geom
我只是想为遇到几何体类型问题的其他人提供这些信息。我在谷歌上为你搜索了一篇文章,这篇文章似乎有很多关于你所追求的东西的信息:我已经找到了那篇文章。它似乎有我想要的信息,但它是2008年的,正在处理表的创建。我特别关注2012年的视图创建。感谢点
方法太棒了。字符串连接的废话更少。仅供参考,这是正确的,但取决于lat/long的数据类型及其精度,这可能会导致问题。如果lat/long存储为float,则转换为varchar将截断小数,因此该点将略有不同。转换为更高精度的十进制数,然后再转换为varchar将解决此问题。@hcaelxxam当我尝试实现该代码时,收到此SQL执行错误-但是,这些列确实是在视图中创建的,但是它们的值是这样的-我准确地复制了您的示例代码,只替换了视图名称占位符作为实际视图。错误表明纬度值必须在-90到90度之间。我在点args中反转了lat/lon字段名,认为可能是lat/lon被反转了,但仍然得到相同的错误。我现在要用谷歌搜索错误24201。@csterling,在GEOGRAPHY::POINT()中顺序是(lat,long),在GEOGRAPHY::STGeomFromText('POINT()')中顺序是(long,lat)。如果运行查询“从视图名称中选择最小(纬度)、最大(纬度)、最小(经度)、最大(经度)”,会得到什么结果?如果您的点在0到360之间,而不是十进制,您可能会遇到一些问题。@hcaelxxam啊!我想你已经发现了这个问题,所以我需要先清理数据。我可以做一些排除WHERE子句,只保留值在0到+/-118之间的记录吗?