в том же postgis так и делают: на геометрию (многоугольник) делают пространственные индексы и каждый запрос их поминают примерно так:
SELECT road_network, toponymy FROM maps AS m WHERE m.b_box &&
geomfromtext('POINT($lon $lat)',4326) and
st_within(geomfromtext('POINT($lon $lat)',4326), m.b_box)
"&&" позволяет убедиться, что до тяжёлого вычисления st_within мы проверяем, попала ли точка в описывающий данный полигон прямоугольник.
в нашем проекте для этих целей используем postgis: там замечательная функция принадлежности точки многоугольнику есть. Плюс, оптимизированная реализация на C, хоть и пользуем из Java.
SELECT road_network, toponymy FROM maps AS m WHERE m.b_box &&
geomfromtext('POINT($lon $lat)',4326) and
st_within(geomfromtext('POINT($lon $lat)',4326), m.b_box)
"&&" позволяет убедиться, что до тяжёлого вычисления st_within мы проверяем, попала ли точка в описывающий данный полигон прямоугольник.
Ну и другие ухищрения есть :-)