PostGIS ST_DWithin distance_of_srid使用度数,何时应该是Meters

时间:2013-10-12 16:53:51

标签: postgis

我使用PostGIS ST_DWithin使用几何点完全难以理解我遇到了问题。即使我使用SRID 3857的几何点(见下文),ST_DWithin解释似乎将第三个参数(双精度distance_of_srid)解释为DEGREES。这是一个例子。

使用此表test_person_avg_lngs_lats:

       Column        |         Type         | Modifiers 
---------------------+----------------------+-----------
 avg_lng             | double precision     | 
 avg_lat             | double precision     | 
 person_avg_location | geometry(Point,3857) | 
 store_lng           | double precision     | 
 store_lat           | double precision     | 
 store_location      | geometry(Point,3857) |

以及以下查询:

SELECT avg_lat, avg_lng, store_lng, store_lat,
    ST_Distance_Spheroid(person_avg_location, store_location, CAST('SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG","7030\"]]' AS spheroid))/1000 AS distance,
    ST_DWithin(person_avg_location, store_location, 1) AS dwithin
FROM test_person_avg_lngs_lats
WHERE ST_DWithin(person_avg_location, store_location, 1)

查询返回将第三个参数解释为ST_DWithin的结果为1 DEGREE而不是1 METER,即使我使用的SRID 3857几何点已经确认,也使用了米单位。无论我作为第三个参数传递给ST_DWithin,结果始终返回N * 100 km(~66英里)附近的距离。这就是为什么我假设ST_DWithin将其解释为1度。

以下示例结果应解释为一米(距离以英里为单位):

avg_lat         avg_lng        store_lng  store_lat  distance       dwithin
43.3275959623, -71.1169553872, -71.0626,  42.3291,   68.9794023576, true

这是我最接近这个主题的事情:ST_DWithin takes parameter as degree , not meters , why?

有关可能导致此问题的任何想法,或者我可能希望在分析问题时继续前进的想法?

我正在使用:

postgis_full_version                                                                     
------------------------------------------------------------------
 POSTGIS="2.0.0 r9605" GEOS="3.3.3-CAPI-1.7.4" PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, released 2012/10/08" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER
(1 row)

version                                                   
-------------------------------------------------------------
 PostgreSQL 9.1.9 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
(1 row)

1 个答案:

答案 0 :(得分:0)

显然,distance_of_srid使用SRID的相同距离单位,通常为度数或米。使用geometry类型,距离是在平坦的笛卡尔平面using maths familiar to most high school students上计算的。对于geometry类型,解释单位。

但是,这假设数据实际上是使用正确的SRID进行投影的。如果你将像3857这样的投影SRID与表示为度数的纬度/经度坐标混合,那么你将得到无法解释的垃圾。查看您填充person_avg_locationstore_location列的方式,因为我99.9%肯定那里有错误。