11

我有以下查询:

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

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

有人可以给我一个例子,如何以米为单位获得 spaceite 的结果吗?

这些职位都在欧洲。

4

2 回答 2

22

只需将度数乘以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 有哪些选择?

确实,正如您在评论中所说,一种选择是投影您的几何图形,并计算这些几何图形。在欧洲使用 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 和使用GeodesicLength函数创建一个 LINESTRING,如下所示:

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

833.910006698673按预期返回。

于 2012-08-30T21:06:29.353 回答
11

在 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
于 2013-11-30T23:09:31.260 回答