通过PostgreSQL / PostGIS请求获取两点之间的度量距离

时间:2014-09-16 19:01:58

标签: postgresql postgis srid

我对postgreSQL / postGIS的使用有疑问。

我想在地图上显示标记(存储在数据库中),这些标记距离用户一定距离(给予请求的坐标)。

标记字段的类型是POINT(我存储lat / long)。 用户位置由Google Map API确定。

以下是实际要求:

SELECT * FROM geo_points WHERE ST_distance(ST_SetSRID(geo_points.coords::geometry,4326),ST_GeomFromEWKT('SRID=4326;POINT(45.0653944 4.859764599999996)')) > 65

我知道(在互联网上进行一些研究之后)函数ST_distance给出了标记与用户位置之间的距离,并且我测试了以km为单位的距离。

我想我必须使用函数ST_tranform来转换公制坐标中的点。

所以我的问题是: - 法国的SRID是什么? - 如何根据用户位置动态地为整个世界制作?

我也知道函数ST_within存在并且可以做到这一点。但我预计以后的事实,我可能需要距离。

非常感谢任何帮助

ps:在其他帖子中可能有解决方案,但我在研究过程中找到的所有答案都不能满足我的需求。

1 个答案:

答案 0 :(得分:1)

首先,要注意PostGIS使用的坐标的轴顺序,它应该是long / lat。目前you are searching in Somalia。交换到坐标you would be searching in France

您可以使用geography type的测地线计算,或使用ST_Distance_Spheroid等测地函数。对于地理位置类型,您可能希望使用ST_DWithin来获得更高的效果。

以下geo_points离法国(非索马里)兴趣点65米或更远:

SELECT * FROM geo_points
WHERE ST_Distance_Spheroid(
    ST_Transform(geo_points.coords::geometry, 4326),
    ST_SetSRID(ST_MakePoint(4.859764599999996, 45.0653944), 4326),
    'SPHEROID["WGS 84",6378137,298.257223563]') < 65.0;

然而,它会非常慢,因为它需要找到每个geo_points的距离,所以只有在你不关心性能并且不到几千点时才这样做。

如果您更改并转换geo_points.coords以将lon / lat(WGS84)存储为geography类型:

SELECT * FROM geo_points
WHERE ST_DWithin(
    geo_points::geography,
    ST_SetSRID(ST_MakePoint(4.859764599999996, 45.0653944), 4326)::geography,
    65.0);