我对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:在其他帖子中可能有解决方案,但我在研究过程中找到的所有答案都不能满足我的需求。答案 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);