Web墨卡托投影中更好的距离测量


10

我正在使用ESRI堆栈,将图层存储在启用了sql-spatial的SDE地理数据库(几何类型,Web Mercator-3857)中。

我正在构建一个Web制图应用程序,因此默认情况下,图块也位于Web Merator 3857中。

通过存储的proc,我使用STDistance来查询从用户位置(Web Mercator中的坐标)到各个层的距离。

问题是,由于网络墨卡托变形,距离距离赤道越远,我的距离计算越来越少。

我曾想过将图层存储在sql-spatial-geography(而非几何)类型中,但是:

  • 我想我的距离查询将花费更长的时间(球面上的距离计算)
  • 我将需要重新导入很多数据
  • arcgis服务不会像他们需要的那样快速地进行投影

如果我去Google地图并进行距离计算,即使在北/北地区,返回的距离也要精确得多,因此我认为Google必须纠正由网络墨卡托投影引起的失真。

那么我的问题是:是否有一个简单的因子值可以应用于网络墨卡托投影中进行的距离计算,以获得“正确的”距离?

Answers:


12

对于短距离,您可以将计算出的距离乘以cos(lat),因为墨卡托投影的比例与纬度的割线成正比(割线为1/cos)。另请参阅 http://en.wikipedia.org/wiki/Mercator_projection#Mathematics_of_the_projection


感谢@ jeremiah-england进行的附录:尽管上述校正对于真正的Mercator投影是正确的,但Web Mercator(EPSG:3857)不是Mercator。EPSG称其为“伪墨卡托”。问题在于它使用了椭圆模型WGS84,并使用了球形墨卡托计算(由于速度更快,Google使用了它)来进行投影。如果1/cos(phi)使用网络墨卡托缩放距离,则赤道将有0.6%的折扣。有关更多详细信息,请参见Noel Zinn在Web Mercator上的演示

根据上述介绍,可以使用以下方法从网络墨卡托坐标计算出更准确的距离。给定dx—水平坐标差(WE方向)和dy—垂直坐标差(SN方向):

e = 0.081819191
adjustedX = dx * cos(lat) / sqrt(1 - e^2 * sin(lat)^2)
adjustedY = dy * cos(lat) * (1 - e^2) / pow(1 - e^2 * sin(lat)^2, 3/2)
adjustedDistance = hypot(adjustedX, adjustedY)

此调整cos(lat)幅度与SN方向之间的比值较大,范围从0.9933赤道1.0034到极点。WE方向比率从1赤道开始,然后增长1.0034到极点。

请注意,此校正仍然仅在短距离(可以假定地球表面的平面几何形状)上有效地起作用。


1
对于更长的距离,您可以使用两个端点的平均纬度:cos((l1 + l2)/2)这将为您提供菱形线/恒定航向距离,而不是大圆距。
MerseyViking 2011年

只会更改椭球体,但不会提供与局部投影相同的精度。
falcacibar 2011年

1
@falcibar-我看不到如何选择平均纬度会改变球体
mkadunc 2011年

@MerseyViking:谢谢,忘了提及计算所用的最佳纬度将是两个比较点的均值。
mkadunc 2011年

1
+1作为答案。@默西:为什么平均纬度校正有效?毕竟,墨卡托(Mercator)中的变形可能会变得任意大,而Loxodromes与测地线的偏离也可能会很大。似乎可能会发生一些潜在的巨大错误,因此对其进行简单的校正是不可靠的。
ub

6

GEOGRAPHY如果您要寻找有关全局数据的准确结果,我会考虑您的第二种选择,即再次以该格式存储数据。

没有什么可以阻止您在表中具有两个空间字段-一个在Mercator中作为一种GEOMETRY类型,在一个WGS84中作为一种GEOGRAPHY类型(至少在SQL Server中不是,我不确定ArcSDE)。

您应该能够创建一个简单的地理处理脚本,该脚本将使用原始数据填充这两个字段。如果正在进行编辑并且经常进行更新,那么这可能不是一个选择。

一旦拥有两个字段,就可以继续使用Mercator进行快速显示,并将用户输入的点转换为纬度/经度以获取距离。

这有两个主要优点:

  • 您还可以根据用户查询获得更准确的特征区域和长度
  • 您无需担心会忘记为处理测量的每个查询添加自定义代码

查询速度将更加复杂,但对于用户而言可能并不明显。在决定解决方案之前,您可能需要使用一个要素类进行测试。您还必须从Mercator转换用户输入的点(这应该很简单,并且可以在浏览器中完成)。

即使使用地理位置类型,仍然存在误差范围:

地理方法的误差容限可高达1.0e-7 *范围

MSDN


不幸的是,SDE仅允许一个空间列:help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… -我没有尝试创建视图并向SDE注册它,但这可能是一种可能的方法。
Allan Adair

@Allan-很高兴知道。那么使用SDE的另一个好处!仅具有4326几何图形并联接回原始表+空间视图的表应达到相同的目的
geographika

3

ESRI的另一建议是使用“几何服务”,该服务涉及将几何发送到ArcGIS Server并返回结果。如果您不希望使用Web服务遇到任何瓶颈问题,那么这可能是一种非常有效的方法。我在Silverlight应用程序中使用了相同的方法。

以下是ESRI的原始博客文章:http : //blogs.esri.com/Dev/blogs/arcgisserver/archive/2010/03/05/Measuring-distances-and-areas-when-your-map-uses-the -Mercator-projection.aspx

博客中有一个简化的JavaScript示例,这里还有一个完整的示例应用程序:http : //serverapps.esri.com/javascript_examples/compare_measurements.htm


0

就像Google Earth一样,您可以将几何转换为本地WGS84区域投影,或将增强的WGS84投影转换为南美的SIRGAS。

您可以在http://www.spatialreference.org中查找几乎所有“分区”投影的坐标,并且可以制作表格等,以根据区域进行变换。

我们想象一个桌子区域

|   minx     |    miny    |    maxx    |   maxy     |  srid  |
+------------+------------+------------+------------+--------+
|234567.34314|234567.34334|234567.34334|234567.34334|  1234  |

存储在球形墨卡托(Web Mercator)中的所有minx,miny,maxx,maxy值。所以我将以postgis为例。

SELECT ST_Distance(
         ST_Transform( -- transform/reproject
            ST_SetSRID(geom_line, 3857) -- geom_line with forced srid assignation to web mercator
            , ( -- here we get the first SRID from the spatial position of geom_line
                 SELECT  srid
                 FROM    zones
                 WHERE   ST_Contains(
                           ST_MakeBox2d(ST_Point(minx,miny),ST_Point(maxx,maxy))
                           , geom_line
                         )
                 LIMIT 1
            ))

希望这会有用,祝您有愉快的一天。


我不确定,但是基于Blomster在他的问题中对“ STDistance”的使用,听起来好像他没有在使用PostGIS。如果Blomster使用的是SQL Server,则没有ST_Transform功能。
Allan Adair

我给出了解决问题的过程和最佳方法,他可以处理其余的问题,也可以使用软件重新投影,但实际上很遗憾SQL Server不处理投影。
falcacibar 2011年

也许启用了CLR,.net库nettopologysuite可以帮助您吗?
falcacibar

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.