使用Spatialite获取距离时,如何获得以米为单位而不是以度数为单位的距离?

11

我有以下查询:

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

这给出了0.97度。但我需要用米来表示,不知道要转换到哪个SRID。

有人能给我一个在spatialite中如何将结果转换为米的示例吗?

这些位置都在欧洲。

2个回答

22
只需将度数值乘以111195,这个值是(地球平均半径)*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中有哪些选项可供选择呢?

确实,正如您在评论中所说的,一种选择是对您的几何图形进行投影,并在其上进行计算。对于欧洲地区,使用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

至于您提供的其他示例(在评论中):

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米的距离。尝试了一段时间后,我使用了以下查询: 选择距离(transform(GeomFromText('POINT(8.328957 49.920900)',4326),3035),transform(GeomFromText('POINT(8.339665 49.918000)',4326),3035)) 这让我得到了834米。 - tmanthey
是的,它应该工作得相当不错(请参见我的编辑答案)。 - Incidently
非常感谢。最后一个问题。您有一种详细的方式来选择SRID吗? - tmanthey
1
我相信在选择正确的SRID背后有很多科学,但我会这样做:在您的Spatialite数据库中运行SELECT * FROM spatial_ref_sys WHERE ref_sys_name like 'WGS 84 / UTM zone%'。您将获得120个区域(使用UTM坐标系和与SRID 4326相同的椭球体)的SRID。在http://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system上了解UTM区域。 - Incidently
这与您的位置有关,在一个常数中不能乘以度数。 - ghanbari
十进制度不是长度单位。在任何给定的位置,相应于十进制度的长度也随着方位角而变化。 - ghanbari

12
在SpatiaLite的函数参考指南中,您可以看到Distance()函数有两个版本。其中一个只需要两个参数并返回CRS单位的距离,另一个需要三个参数并返回米为单位的距离。
要获取以米为单位的距离,只需将第三个参数传递给Distance:
sqlite> select Distance(MakePoint(0, 0), MakePoint(3, 4));
5.0
sqlite> select Distance(MakePoint(0, 0), MakePoint(3, 4), 1);
554058.923752633

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