Получить полигон из долготы и широты в мобильных приложениях - PullRequest
0 голосов
/ 05 мая 2019

Я работаю над приложением, которое имеет более 2 миллионов пользователей. Это собирается ввести функцию на основе местоположения. С самого начала мы хотим предоставить пользователю уведомление на основе местоположения, которое будет изменено в зависимости от его местоположения / региона. Я использую технологии PostGIS и Mapbox. У меня есть пользовательский полигон, который является индикатором другого региона. Я знаю, что могу использовать ST_Within из PostGIS для получения информации о многоугольнике, каждый раз отправляя на сервер долготу и широту. Я использую функцию Folloing, чтобы получить регион

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 поддерживает запрос с использованием векторных плиток. Является ли приведение лучей или запрос в векторных листах лучшим подходом для выполнения той же задачи? (Снова запомните, многоугольник не является постоянным.)

В двух словах, я на самом деле хочу узнать лучшие практики, которые в настоящее время используются сообществом для снижения нагрузки на сервер и экономии времени.

1 Ответ

2 голосов
/ 08 мая 2019

1) Вам нужно будет проиндексировать свои полигоны, используя некоторую сетку (может быть UTM, плитки Google или вашу собственную сетку)

2) Определить сетку местоположения пользователя

3) Теперь выберите полигоны, которые лежат на одной и той же сетке. В лучшем случае вы получите только один полигон и вам не нужно будет использовать ST_Within.

4) Теперь, если вы получаете несколько полигонов, используйте ST_Within только с этими полигонами вместо всего списка полигонов

Этот алгоритм сэкономит много памяти и обработки, так как ST_Within - очень тяжелый процесс.

Примечание: я использую этот подход в течение последних 4 лет, и он совершил чудеса с точки зрения экономии времени и памяти

...