gpt4 book ai didi

sql - 获取以米为单位的距离而不是 Spatialite 的度数

转载 作者:行者123 更新时间:2023-12-04 02:38:52 26 4
gpt4 key购买 nike

我有以下查询:

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

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

有人能给我一个例子,如何获得以米为单位的空间结果?

这些职位都在欧洲。

最佳答案

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

有一个更简单的方法来做到这一点(如果你有两个点,而不是一个点和一个线串):用你的点创建一个线串并使用 GeodesicLength函数,像这样:
select GeodesicLength(GeomFromText('LINESTRING(8.328957 49.920900, 8.339665 49.918000)',4326))

它返回 833.910006698673 ,正如预期的那样。

关于sql - 获取以米为单位的距离而不是 Spatialite 的度数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12204834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com