POSTGRESQL - 地理定位的多边形函数
POSTGRESQL - Polygon function for geolocations
我有 2 tables User_places,我可以在其中看到每个用户的家庭位置,这些位置由 2 个单独的属性定义:经度和纬度。
我还有第二个 table 具有属性 'Area' 的社区,它将每个社区定义为多边形 - jsonb 格式 - “[{"latitude":XXXXX,"longitude":YYYYY},{"latitude":ZZZZZ,"longitude":AAAAA},{"latitude":BBBBBB,"longitude":CCCCC},{"latitude":DDDDD,"longitude":EEEEE }]".
有人知道如何检查特定用户是否住在 Postgresql 的给定社区吗?
我假设您已经 Postgis 安装在您的 postgresql 副本上?因为它具有对 postgresql 的所有几何和地理功能扩展。
您可以使用 ST_Contains 来检查一个点是否包含在给定的多边形中,这个 returns 是一个布尔值。
select ST_Contains(neigbourhood.polygon,User_place.geom)
如果您在 User_places table 中没有几何点值,则可以使用 ST_SetSRID function and ST_MakePoint 函数创建。
例如 - SELECT ST_SetSRID(ST_MakePoint(LAT, LON),SRID);
其中 SRID 是您使用的投影的参考,例如 WGS 84 的 4326 `
我会建议在 postgresql 中确保所有地理 table 都包含 geom,因为这样比较容易得多。
作为参考,获取基于地理和几何数据库的问题答案的好地方是 https://gis.stackexchange.com/
SELECT
user_id,
ST_Contains(
ST_GeomFromText(
(select
replace(replace(replace(replace(replace(area::text,']','))'),'[','POLYGON(('),'}', ''),',"longitude":',' '),'{"latitude":','')
from neighbourhoods
limit 1), 4326)
(ST_SetSRID(ST_MakePoint(latitude, longitude),4326))
) as polygon_check
from user_places
我有 2 tables User_places,我可以在其中看到每个用户的家庭位置,这些位置由 2 个单独的属性定义:经度和纬度。 我还有第二个 table 具有属性 'Area' 的社区,它将每个社区定义为多边形 - jsonb 格式 - “[{"latitude":XXXXX,"longitude":YYYYY},{"latitude":ZZZZZ,"longitude":AAAAA},{"latitude":BBBBBB,"longitude":CCCCC},{"latitude":DDDDD,"longitude":EEEEE }]".
有人知道如何检查特定用户是否住在 Postgresql 的给定社区吗?
我假设您已经 Postgis 安装在您的 postgresql 副本上?因为它具有对 postgresql 的所有几何和地理功能扩展。
您可以使用 ST_Contains 来检查一个点是否包含在给定的多边形中,这个 returns 是一个布尔值。
select ST_Contains(neigbourhood.polygon,User_place.geom)
如果您在 User_places table 中没有几何点值,则可以使用 ST_SetSRID function and ST_MakePoint 函数创建。
例如 - SELECT ST_SetSRID(ST_MakePoint(LAT, LON),SRID);
其中 SRID 是您使用的投影的参考,例如 WGS 84 的 4326 `
我会建议在 postgresql 中确保所有地理 table 都包含 geom,因为这样比较容易得多。
作为参考,获取基于地理和几何数据库的问题答案的好地方是 https://gis.stackexchange.com/
SELECT
user_id,
ST_Contains(
ST_GeomFromText(
(select
replace(replace(replace(replace(replace(area::text,']','))'),'[','POLYGON(('),'}', ''),',"longitude":',' '),'{"latitude":','')
from neighbourhoods
limit 1), 4326)
(ST_SetSRID(ST_MakePoint(latitude, longitude),4326))
) as polygon_check
from user_places