在移动应用中从经度和纬度获取多边形

时间:2019-05-05 10:18:07

标签: android gis mapbox postgis

我正在开发一个拥有超过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和矢量切片。在矢量图块中进行射线投射或查询是否是执行同一操作的更好方法? (再次记住,多边形不是恒定的。)

简而言之,我实际上是想了解社区当前使用的最佳实践,以减少服务器的负担并节省时间。

1 个答案:

答案 0 :(得分:2)

1)您将必须使用某些网格(可以是UTM,Google磁贴或您自己的自定义网格)为多边形建立索引

2)标识用户位置的网格

3)现在获取位于同一网格上的多边形。在最佳情况下,您将只获得一个多边形,而不必使用ST_Within。

4)现在,如果您有多个多边形,请仅对这些多边形使用ST_Within而不是整个多边形列表

该算法将节省大量内存和处理,因为ST_Within是一个非常繁重的过程。

注意:在过去的4年中,我一直在使用这种方法,它在时间和内存节省方面都产生了奇迹