gpt4 book ai didi

postgresql - PostGis 距离计算

转载 作者:行者123 更新时间:2023-11-29 11:18:56 26 4
gpt4 key购买 nike

我现在正在做一个室内地图导航应用程序,我想做的是建立一个建筑物内 map 点的数据库。

我使用的所有坐标都取自谷歌地图(这意味着 EPSG 是 3857)。我现在需要做的是找到以米为单位的距离以及以米为单位使用 D_Within

当我尝试提取两点之间的距离时:

SELECT ST_DISTANCE(
ST_GeomFromText('POINT(' || StartLon || ' ' || StartLat || ')',3857),
ST_GeomFromText('POINT(' || EndLon || ' ' || EndLat || ')',3857))
FROM i3_building.floordata;

对于前 2 行:

Start: 103.776047 1.292149; End: 103.77607 1.292212 (3 meters away)
Start: 103.776070 1.292212; End: 103.77554 1.292406 (50 meters away)

给出的结果是:

2.59422435413724e-005
4.11096095831604e-005

即使是 rad,第二个结果也只是第一个的两倍。所以这让我很困惑。然后我尝试将其输出为米:

SELECT ST_DISTANCE(
ST_GeographyFromText('POINT(' || StartLon || ' ' || StartLat || ')'),
ST_GeographyFromText('POINT(' || EndLon || ' ' || EndLat || ')'))
FROM i3_building.floordata;

相同行给出的结果是:

2.872546829
4.572207435

这也不是我所期望的。我对 PostGis 和 SRID 不是很熟悉所以这个问题可能看起来很简单但是请帮助我,我没有@@

最佳答案

您的坐标引用系统 (CRS) 是 4326,纬度/经度。这是与谷歌地图混淆的一个常见来源:3857 是谷歌地图为其图 block 使用的 CRS,是基于球形地球仪的投影米。添加到 Google map 的矢量源(KML 数据、GPS 转储等)往往采用纬度/经度 4326,这是以度为单位的测量值并在运行中转换。

如果您想要两个纬度/经度点之间的距离(以米为单位),请使用 ST_Distance_Sphere .例如,对于您的第一组点,

SELECT ST_Distance_Sphere(ST_MakePoint(103.776047, 1.292149),ST_MakePoint(103.77607, 1.292212));

给出 7.457 米。基于相同的查询,您的第二组点彼此相距 62.74 米。

注意还有 ST_Distance_Spheroid它采用第三个参数,测量球体,即地球形状的近似值。这可能会更准确,但在小距离内可能并不重要。

ST_Distance 给出投影坐标中的距离,这可能就是为什么插入经/纬度值会得到奇怪结果的原因。

编辑:如评论中所述,从 Postgis 2.2 开始,此函数已重命名为 ST_DistanceSphere

关于postgresql - PostGis 距离计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24624257/

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