我正在开发一个拥有超过200万用户的应用程序。它将介绍基于位置的功能。从一开始,我们就希望向用户提供基于位置的通知,该通知将根据他们的位置/区域进行更改。我正在使用PostGIS和Mapbox技术。我有一个自定义多边形,它是不同区域的指标。我知道我可以使用PostGIS的ST_Within通过每次向服务器发送经度和纬度来获取多边形信息。我正在使用以下功能来获取区域
CREATE OR REPLACE FUNCTION getRegion(getlng numeric, getlat numeric, OUT outregion text)
as $$
BEGIN
SELECT region into outregion
FROM mypolygon
WHERE ST_Within(
ST_GeometryFromText(
'POINT('|| getlng ||' '|| getlat ||')', 4326
),
geom);
END; $$
LANGUAGE PLPGSQL;
并通过
调用该函数SELECT getRegion(getlng, getlat);
但是,由于有数百万的用户,这将增加数据库服务器的负载,并且需要提高TPS。除了直接使用postgis之外,还有其他方法可以从点获取多边形/区域吗?区域多边形是可变的,而不是恒定的。
有一种名为ray-casting的方法,最近mapbox支持query和矢量切片。在矢量图块中进行射线投射或查询是否是执行同一操作的更好方法? (再次记住,多边形不是恒定的。)
简而言之,我实际上是想了解社区当前使用的最佳实践,以减少服务器的负担并节省时间。
答案 0 :(得分:2)
1)您将必须使用某些网格(可以是UTM,Google磁贴或您自己的自定义网格)为多边形建立索引
2)标识用户位置的网格
3)现在获取位于同一网格上的多边形。在最佳情况下,您将只获得一个多边形,而不必使用ST_Within。
4)现在,如果您有多个多边形,请仅对这些多边形使用ST_Within而不是整个多边形列表
该算法将节省大量内存和处理,因为ST_Within是一个非常繁重的过程。
注意:在过去的4年中,我一直在使用这种方法,它在时间和内存节省方面都产生了奇迹