【问题标题】:Get Distance in Meters instead of degrees in Spatialite以米为单位获取距离,而不是 Spatialite 中的度数
【发布时间】:2012-08-30 20:19:12
【问题描述】:

我有以下疑问:

select distance(GeomFromText('POINT(8 49)',4326),GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))

这给了我 0.97 度。但我需要它以米为单位,不知道要转换到哪个 SRID。

谁能给我一个例子,如何获得以米为单位的spatialite结果?

职位都在欧洲。

【问题讨论】:

    标签: sql geospatial spatialite


    【解决方案1】:

    只需将度数乘以111195 - 这个值就是(Earth mean radius)*PI/180 - 即“地球表面上一个大圆度数的平均长度”。

    使用此方法获得的结果在 WGS84 椭球的测地线距离的 1% 以内。


    编辑

    好吧,我上面的回答仍然代表这个问题:“如何将弧度以米为单位转换”,但是,这不是你问的问题(应该问)。

    我没有专业地使用过 Spatialite,所以我假设您的示例查询确实返回了“以度为单位的长度”。这不是真的。

    不幸的是,Spatialite 似乎无法从“地理意义上”计算距离。尽管您的几何图形是使用 SRID 4326 定义的,但它会将它们视为在平面上。

    这是一个简单的证明:

    select Distance(GeomFromText('POINT(0 0)',4326),GeomFromText('POINT(3 4)',4326));
    

    返回5.0

    可惜了……

    让我们看看您的原始查询:

    select Distance(
      GeomFromText('POINT(8 49)',4326),
      GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326)
    )
    

    MS SQL Server 中的等效查询:

    SELECT (geography::STGeomFromText('POINT(8 49)', 4326)).STDistance(geography::STGeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)', 4326));
    

    立即为您提供正确的结果:105006.59673084648,以米为单位,没有任何额外的喧闹。

    那么您对 ​​Spatialite 有哪些选择?

    确实,正如您在 cmets 中所说,一种选择是投影您的几何图形,并根据这些几何图形进行计算。在欧洲使用 SRID 3035 也很有意义(如果您的位置主要在德国,我会考虑使用 SRID 25832)。

    select Distance(
      Transform(GeomFromText('POINT(8 49)',4326),25832),
      Transform(GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326),25832)
    )
    

    返回104969.401605453

    关于您的其他样本(以 cmets 为单位):

    select distance(
      Transform(GeomFromText('POINT(8.328957 49.920900)',4326),3035),
      Transform(GeomFromText('POINT(8.339665 49.918000)',4326),3035)
    )
    

    有一种更简单的方法(如果您有两个 POINT,而不是 POINT 和 LINESTRING):使用您的 POINT 创建一个 LINESTRING 并使用 GeodesicLength 函数,如下所示:

    select GeodesicLength(GeomFromText('LINESTRING(8.328957 49.920900, 8.339665 49.918000)',4326))
    

    它按预期返回833.910006698673

    【讨论】:

    • 嗯,这让我在 1218 米以上的位置。使用 Google 地球时,我的距离为 833 米。尝试了一段时间后,我使用了这个查询: select distance(transform(GeomFromText('POINT(8.328957 49.920900)',4326),3035),transform(GeomFromText('POINT(8.339665 49.918000)',4326),3035)) 得到我 834 米
    • 是的,它应该工作得相当好(也请参阅我编辑的答案)
    • 非常感谢。最后一个问题。您有精心挑选 SRID 的方法吗?
    • 我确信选择正确的 SRID 背后有很多科学知识,但我要做的是:运行 SELECT * FROM spatial_ref_sys WHERE ref_sys_name like 'WGS 84 / UTM zone%' in您的 Spatialite 数据库。您将获得 120 个区域的 SRID(使用 UTM 坐标系和与 SRID 4326 中相同的椭球)。在en.wikipedia.org/wiki/… 阅读 UTM 区域
    • 和你的位置有关,度数不能乘以一个常数
    【解决方案2】:

    在 SpatiaLite 的functions reference guide 中,可以看到Distance() 函数有两个版本。一个只接受两个参数并以 CRS 单位返回距离,另一个接受 3 个参数并以米为单位返回距离。

    要获得以米为单位的距离,只需将第三个参数传递给 Distance:

    sqlite> select Distance(MakePoint(0, 0), MakePoint(3, 4));
    5.0
    sqlite> select Distance(MakePoint(0, 0), MakePoint(3, 4), 1);
    554058.923752633
    

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多