Point-in-Polygon мне кажется нужным. Но чтобы ускорить ваш алгоритм, разделите пространство сеткой. У вас может быть квад, который кодирует город, и квад, который находится внутри города, чтобы ускорить ваше обнаружение. Только если точка находится внутри внешнего четырехугольника, а не внутри внутреннего четырехугольника, используйте point-in-poly al go. Квадратные деревья, предложенные Мехди, могут быть реализованы очень быстро. Но лучшим решением, вероятно, является отображение на сетку, как описано ниже, вы получите решение O (1) :
Вероятно, вы также можете ускорить алгоритм PIP, разбивая многоугольник на мозаику.
С соответствующей функцией округления вы можете использовать координаты своей точки в качестве индексов для двумерного массива и определить в O (1) , находится ли он в конкретном городе, если нет. в городе или если требуется дальнейшее исследование.
Пример: точка (3,4560, 5,1547) Сетка 10x10. City1 - это (3,4), (3,5) граница City1 пересекает (3,3), (4,3), (4,4), (4,5), (4,6), (3, 6), (2,6), (2,5), (2,4), (2,3). Округляя точку до целых чисел, вы получаете 3,5, которые можно использовать в качестве индексов для матрицы, которая будет в Mat (3,5) = C1, где C1 означает City1. Вы можете использовать этот трюк с географическими координатами с произвольно выбранным разрешением.
формула для сопоставления координаты с индексом массива:
Coordinate c in [a,b]
array index i in [0,n-1]
i = floor( (c-a) / ((b-a)/n) )