GeoSpark SQL与PostgreSQL计算两点距离结果不一致,如何获取正确值?
两点距离计算结果差异分析与解决
哪个结果正确?
PostgreSQL计算得到的1192米是正确的,原因如下:
- PostgreSQL中
ST_GeographyFromText创建的是地理(Geography)类型,基于地球椭球体模型计算的是真实地表的大地线距离,符合实际空间距离逻辑。 - 你用GeoSpark时将坐标转换到了EPSG:3857(Web墨卡托投影),这是一种平面投影坐标系,在非赤道区域会存在距离和面积的拉伸变形,计算出的是平面笛卡尔距离,所以结果(1316米)偏大,并非真实的地表距离。
另外注意:你GeoSpark代码里写的epsg:4236是笔误,正确的WGS84地理坐标系EPSG代码是4326。
如何用GeoSpark SQL获取正确结果?
不需要将坐标转换到平面投影,直接使用GeoSpark提供的球面/椭球面距离计算函数即可:
方式1:使用ST_DistanceSphere(球体模型,精度较高)
基于球体计算两点间的球面距离,默认采用WGS84坐标系:
sql(""" SELECT ST_DistanceSphere( ST_GeomFromText('Point (102.756444 25.038064)'), ST_GeomFromText('Point (102.745025 25.040838)') ) """).show(false)
方式2:使用ST_DistanceSpheroid(椭球体模型,精度最高,与PostGIS结果一致)
基于WGS84椭球体计算大地线距离,和PostgreSQL的Geography类型计算逻辑完全匹配:
sql(""" SELECT ST_DistanceSpheroid( ST_GeomFromText('Point (102.756444 25.038064)'), ST_GeomFromText('Point (102.745025 25.040838)'), 'SPHEROID["WGS 84",6378137,298.257223563]' ) """).show(false)
这两种方式计算出的结果都会和PostgreSQL的1192米一致,反映真实的地表距离。
内容的提问来源于stack exchange,提问作者mentongwu
相关产品推荐
相关产品推荐

