只需将度数乘以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。