在Spatialite中获取米的距离而不是度数

tma*_*hey 10 sql geospatial spatialite

我有以下查询:

select distance(GeomFromText('POINT(8 49)',4326),GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))
Run Code Online (Sandbox Code Playgroud)

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

有人可以举个例子来说明如何以米为单位获得空间效果吗?

这些职位都在欧洲.

Inc*_*tly 21

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

使用此方法的最大误差为~0.1%


编辑

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

我没有专业地使用Spatialite,所以我假设你的样本查询确实返回'以度为单位的长度'.这不是真的.

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

这是一个简单的证明:

select Distance(GeomFromText('POINT(0 0)',4326),GeomFromText('POINT(3 4)',4326));
Run Code Online (Sandbox Code Playgroud)

回报5.0.

这是一个耻辱 ...

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

select Distance(
  GeomFromText('POINT(8 49)',4326),
  GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326)
)
Run Code Online (Sandbox Code Playgroud)

MS SQL Server中的等效查询:

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

立即得到正确的结果: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)
)
Run Code Online (Sandbox Code Playgroud)

回报104969.401605453.

至于你的其他样本(在评论中):

select distance(
  Transform(GeomFromText('POINT(8.328957 49.920900)',4326),3035),
  Transform(GeomFromText('POINT(8.339665 49.918000)',4326),3035)
)
Run Code Online (Sandbox Code Playgroud)

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

select GeodesicLength(GeomFromText('LINESTRING(8.328957 49.920900, 8.339665 49.918000)',4326))
Run Code Online (Sandbox Code Playgroud)

833.910006698673按预期返回.


小智 10

在SpatiaLite的函数参考指南中,您可以看到有两个版本的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
Run Code Online (Sandbox Code Playgroud)