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

Android 在移动应用程序中从经度和纬度获取多边形,android,gis,mapbox,postgis,Android,Gis,Mapbox,Postgis,我正在开发一款拥有超过200万用户的应用程序。它将引入基于位置的功能。从一开始,我们希望向用户提供一个基于位置的通知,该通知将根据用户的位置/地区进行更改。我正在使用PostGIS和Mapbox技术。我有一个自定义多边形,它是不同区域的指示器。我知道我可以使用PostGIS中的ST_通过每次向服务器发送经度和纬度来获取多边形信息。我使用下面的函数来获得区域 CREATE OR REPLACE FUNCTION getRegion(getlng numeric, getlat numeric, O

我正在开发一款拥有超过200万用户的应用程序。它将引入基于位置的功能。从一开始,我们希望向用户提供一个基于位置的通知,该通知将根据用户的位置/地区进行更改。我正在使用PostGIS和Mapbox技术。我有一个自定义多边形,它是不同区域的指示器。我知道我可以使用PostGIS中的ST_通过每次向服务器发送经度和纬度来获取多边形信息。我使用下面的函数来获得区域

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,还有其他方法从点获取多边形/区域吗?区域多边形是可更改的,而不是常量

有一种方法叫做mapbox,最近mapbox支持使用矢量分片。在矢量图块中进行光线投射或查询是否是做同样事情的更好方法?(请再次记住,多边形不是常数。)

简言之,我实际上想知道社区目前使用的最佳做法,以减少服务器负载并节省时间。

1)您必须使用一些网格(可能是UTM、Google tiles或您自己的自定义网格)为多边形编制索引

2) 识别用户位置的网格

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

4) 现在,如果您得到多个多边形,请仅使用ST_in和这些多边形,而不是整个多边形列表

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

注意:过去4年我一直在使用这种方法,它在节省时间和内存方面创造了奇迹。你必须使用一些网格(可能是UTM、谷歌瓷砖或你自己的自定义网格)为多边形编制索引

2) 识别用户位置的网格

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

4) 现在,如果您得到多个多边形,请仅使用ST_in和这些多边形,而不是整个多边形列表

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


注意:过去4年我一直在使用这种方法,它在节省时间和内存方面创造了奇迹?表格有多大?
mypolygon
?14MB形状文件。postgresQuick中的8-10 MB表空间问题:索引看起来如何?表格有多大?
mypolygon
?14MB形状文件。postgrescan中的8-10 MB表空间请详细说明第一点。如果没有PostGIS操作,我如何识别应用程序用户的网格?是否有任何方法可以从应用程序(iOS或Android)获取网格,您需要为其编写Android版本。使用方法:gmap tile generator/trunk/gmaps tile creator/src/gov/ca/maps/tile/geom/GlobalMercator.java>>public int[]谷歌瓷砖(双lat,双lon,int zoom)此方法返回瓷砖网格上面是指向谷歌瓷砖网格代码的链接。下面是一个示例自定义网格示例:publicstaticdouble[]getGrid(双纬度、双经度、双degreeLat、双degreeLon){double lonRem=(经度%degreeLon);double-latRem=(纬度%degreeLat);经度=经度-lonRem;纬度=纬度-latRem;返回新的double[]{纬度,经度};public static void main(String[]args){double[]grid=getGrid(22.0,81.0,5.0,10.0);System.out.println(grid[0]+“”+grid[1]);}能否请您详细说明一下。如果不进行PostGIS操作,我如何识别应用程序用户的网格?是否有任何方法从应用程序(iOS或Android)获取网格您需要为编写android版本。使用方法:gmap tile generator/trunk/gmaps tile creator/src/gov/ca/maps/tile/geom/GlobalMercator.java>>>public int[]GoogleTile(double-lat,double-lon,int-zoom)此方法返回tile grid上面是指向Google tile grid代码的链接。下面是一个示例自定义网格示例:public static double[]getGrid(双纬度,双经度,双度数,双度数){double lonRem=(经度%degreeLon);double latRem=(纬度%degreeLat);经度=经度-lonRem;纬度=纬度-latRem;返回新的双[]{纬度,经度};公共静态void main(字符串[]args){double[]grid=getGrid(22.0,81.0,5.0,10.0);System.out.println(grid[0]+“”+grid[1]);}