我正在做一个室内地图导航应用程序,我正在尝试做的是在建筑物中建立一个地图点数据库。
我使用的所有坐标都来自谷歌地图(这意味着EPSG是3857)。我现在需要做的是找到以米为单位的距离以及以米为单位使用D_Within
当我试图提取2点之间的距离时:
SELECT ST_DISTANCE(
ST_GeomFromText('POINT(' || StartLon || ' ' || StartLat || ')',3857),
ST_GeomFromText('POINT(' || EndLon || ' ' || EndLat || ')',3857))
FROM i3_building.floordata;
对于前两行:
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不是很熟悉,所以这个问题可能看起来很简单,但请帮助我,我没有被@@
答案 0 :(得分:13)
您的坐标参照系(CRS)为4326,纬度/经度。这是与谷歌地图混淆的常见原因:3857是谷歌地图用于其瓷砖的CRS,并且是基于球形地球仪的投影仪表。添加到Google地图的矢量来源(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给出了投影坐标的距离,这可能就是为什么你得到插入lat / lon值的奇怪结果。
答案 1 :(得分:0)
这是伪代码
SELECT ST_Distance_Sphere(ST_MakePoint(lng1, lat1),ST_MakePoint(lng2, lat2));
此外,对于球体距离新函数“ST_DistanceSphere”,请使用以下内容
SELECT ST_DistanceSphere(ST_MakePoint(lng1,lat1),ST_MakePoint(lng2,lat2))