Postgresql 查询PostGIS半径,得到奇数结果

Postgresql 查询PostGIS半径,得到奇数结果,postgresql,postgis,Postgresql,Postgis,我是PostGIS新手,我正在尝试创建一个radius查询。我有一个带有几何图形字段(位置)的表,并且在单独的字段上有纬度和经度值 我正试图从lat:40.753777,lon:-73.981568找到半径为10公里的点 与: 结果给了我很远的路分。使用lat和lon对地球距离进行相同的查询,直接得到更接近的结果 SELECT postcode, lat, lon, st_asgeojson(position) geojson FROM addresses WHERE earth_box(ll_

我是PostGIS新手,我正在尝试创建一个radius查询。我有一个带有
几何图形
字段(位置)的表,并且在单独的字段上有纬度和经度值

我正试图从lat:40.753777,lon:-73.981568找到半径为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查询有什么问题吗?

一些注意事项:

  • 我认为当你提出一个观点时,你交换了lat和lon,你的线条是ST_MakePoint(40.753777,-73.981568),但定义是:
  • 因此,它应该是圣卢西亚的关键点(-73.981568,40.753777)

  • 作为一个简单的解决方案,您可以使用ST_Distance_Spheroid函数():

  • 经度和纬度与米无关,所以我认为这并不奇怪。如果数据点分布过于分散,无法合理转换为适当的投影,您可以使用
    地理
    。另一方面,必须先使用long创建点,然后使用latHi@LaurenzAlbe。感谢您的回复,我认为可以在几何字段上计算距离,要获得与点的距离,必须使用地理信息?你知道我用哪一个SRID按米查找吗?@JGH是的,我用lat 42.035149和lon-78.8768906创建的geo json产生了{“类型”:“点”,“坐标”:[-78.8768906,42.035149]}
    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;
    
    geometry ST_MakePoint(double precision x, double precision y);
    Note: x is longitude and y is latitude
    
    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;
    
    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...