【问题标题】:Query PostGIS radius giving me odd results查询 PostGIS 半径给我奇怪的结果
【发布时间】:2019-03-29 03:38:06
【问题描述】:

我是 PostGIS 新手,我正在尝试创建半径查询。我有一个带有geometry 字段(位置)的表,并且在单独的字段中也有纬度和经度值。

我正在尝试从纬度:40.753777,经度:-73.981568 10 公里半径范围内查找点。

与:

SELECT postcode, lat, lon, st_asgeojson(position) geojson, ST_Distance(ST_MakePoint(lat, lon), ST_MakePoint(40.753777, -73.981568)) distance FROM addresses WHERE ST_DWithin(ST_MakePoint(lat, lon), ST_MakePoint(40.753777, -73.981568), 10000) order by id limit 10;

结果给了我很远的路点。使用 lat 和 lon 对地球距离的相同查询直接给了我更接近的结果。

SELECT postcode, lat, lon, st_asgeojson(position) geojson FROM addresses WHERE earth_box(ll_to_earth(40.753777, -73.981568), 10000) @> ll_to_earth(addresses.lat, addresses.lon) order by id limit 10;

但我真的不知道这是否正确,PostGIS 查询有什么问题?

【问题讨论】:

  • 经度和纬度与米无关,所以我认为这并不奇怪。如果数据点过于分布而无法合理转换为适当的投影,您可以使用geography
  • 附带说明,必须先使用 long 创建点,然后再使用 lat
  • 嗨@LaurenzAlbe 感谢您的回复,我认为可以在几何字段上计算距离,以获取距点的距离必须使用地理吗?你知道我用哪个 SRID 来按米查找吗?
  • @JGH 是的,我从 lat 42.035149 和 lon -78.8768906 创建的地理 json 导致 {"type":"Point","coordinates":[-78.8768906,42.035149]}

标签: postgresql postgis


【解决方案1】:

几点说明:

  1. 我认为您在提出观点时交换了纬度和经度,您的行显示 ST_MakePoint(40.753777, -73.981568),但定义是:
geometry ST_MakePoint(double precision x, double precision y);
Note: x is longitude and y is latitude

所以应该改为 ST_MakePoint(-73.981568, 40.753777)。

  1. 作为一个简单的解决方案,您可以使用 ST_Distance_Spheroid 函数 (http://www.postgis.org/docs/ST_Distance_Spheroid.html):
SELECT
    postcode, lat, lon, st_asgeojson(position) AS geojson,
    ST_Distance_Spheroid(
        position,
        ST_GeomFromText('POINT(-73.981568 40.753777)',
        4326), 'SPHEROID["WGS 84",6378137,298.257223563]'
    ) as distance
FROM addresses 
WHERE distance < 10000 LIMIT 10;
  1. 要获得更精确的距离,请从您现有的几何类型列 position 添加一个地理类型的新列:
ALTER TABLE addresses ADD COLUMN position_geog geography(Point,4326);
UPDATE addresses SET position_geog = position::geography;
CREATE INDEX ON addresses USING gist(position_geog);
-- and now you can use ST_DWITHIN with meters...

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 2016-08-29
    • 2018-09-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多