У меня есть таблица PostgreSQL, с почти 2 миллионами строк, с coordinates
полем long-lat в форме POINT(-73.4938 33.2405)
.
Предположим, что в этом поле есть геопространственный индекс. Какой самый эффективный и быстрый способ выделить все строки в произвольной ограничительной рамке?
Коробка , как SW long-lat: -74.0042 40.7688
, NE long-lat: -73.8809 40.7984
.
Ответы:
Предполагая, что заданные пределы ограничительной рамки находятся в той же системе пространственной привязки, что и сохраненные координаты, и вы знаете, какой пространственный оператор (пересекающийся или содержащийся) вам нужен:
В качестве альтернативы, если вы предпочитаете звук «содержит» (вместо «содержится в»),
WHERE
предложение должно быть перевернуто:PS: Учитывая (по OP после того, как выше было опубликовано), что записи являются простыми точками, я думаю, что разница между «пересечениями» и «сдерживанием» становится очень тонкой, затрагивая только точки на краях ограничительной рамки.
источник
What's the fastest ...?
: OP&&
и@
, кажется, не работает при пересечении с геометрией многоугольника. В этом случае используйтеST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))
или альтернативноST_Contains
источник
Очевидно, у меня недостаточно очков, чтобы добавить комментарий, поэтому я использую этот ответ только для того, чтобы сказать, что я попробовал и ST_MakeEnvelope, и сравнение по математике: «x> min_x и x <max_x и y> min_y и y <max_y». ..в среднем ST_MakeEnvelope заняло 60 мс, а сравнение по математике заняло 155 мс на моем конкретном запросе bbox.
Таким образом, пространственный поиск ST_MakeEnvelope должен быть быстрее, чем математическое сравнение!
источник
INDEX
с ST_MakeEnvelope, так и с (ST_XMax, ST_XMin, ST_YMax, ST_YMin), и разница огромна в пользу математики. Математика заняла у меня менее 20 секунд (INDEX + Query), в то время как пересечение огибающей заняло 2 минуты (я сдался, когда оно достигло 2 минут, 40