Elasticsearch Geoshape запрос ложных результатов

У меня есть два geo_shapes в ES. То, что мне нужно выяснить, это лучший способ понять, если одна из фигур (зеленый) содержит или пересекается с другой (красный). Пожалуйста, смотрите ниже визуальное представление трех разных случаев:

Случай I: легко обнаружить - используя координаты зеленой фигуры, создайте запрос Geoshape с отношением "ratio" = "inside"

Случай II: тоже не проблема - используя координаты формы Грина, сделайте запрос Geoshape с помощью "Relations" = "INTERSECTS".

Случай III: это реальная проблема - используя координаты фигуры Грина, я пытаюсь сделать запрос Geoshape с "отношением" = "ИНТЕРЕСАМИ", и в качестве результата возвращается фигура Красного… это неверно - эти фигуры не пересекаются друг с другом (Я так думаю) хотя одна из сторон соприкасается друг с другом…

Есть ли способ избежать ложноположительных результатов здесь? Любые другие предложения, как решить эту задачу?

PS координаты точные (пример: 13.335594692338). Там нет дополнительных отображений, таких как tree_levels или точность...

1 ответ

Решение

Каждый многоугольник, который хранится в Elasticsearch с использованием geoshape, преобразуется в список строк. Чтобы немного сузить это объяснение, я собираюсь предположить, что полигон, который вы храните в Elasticsearch, использует хранилище геохэш (которое используется по умолчанию для типа геошапа).

Я не хочу вдаваться в подробности, но взгляните на это изображение

geohash

и это описание взято из документов Elasticsearch (детали не совпадают, но вам нужно получить общую картину):

Геошаши делят мир на сетку из 32 ячеек - 4 строки и 8 столбцов, каждый из которых представлен буквой или цифрой. Эта ячейка охватывает половину Гренландии, всю Исландию и большую часть Великой Британии. Каждая ячейка может быть дополнительно разделена на еще 32 ячейки, которые могут быть разделены на еще 32 ячейки и так далее. Ячейка gc охватывает Ирландию и Англию, gcp охватывает большую часть Лондона и часть Южной Англии, а gcpuuz94k - это вход в Букингемский дворец, с точностью до 5 метров.

Ваш полигон проецируется в список прямоугольников, каждый из которых представлен строкой (геохэш). Точность этой проекции зависит от уровня дерева. Я не знаю, какой уровень дерева по умолчанию для Elasticsearch, но если вы находите ложные срабатывания, кажется, он слишком низок для вас.

Уровень дерева 8 делит мир на прямоугольники размером 38.2m x 19.1m, Если край вашего многоугольника проходит через середину этого прямоугольника, он может или не может (в зависимости от реализации) назначать геохэш-представление этого прямоугольника вашему многоугольнику.

Чтобы решить вашу проблему, вам нужно увеличить уровень дерева в соответствии с вашими потребностями (подробнее об этом здесь). Остерегайтесь, хотя этот размер индекса значительно увеличится (также зависит от размера и сложности форм). В качестве примера можно сохранить 1000 полигонов с размером района (некоторые имеют 100 точек) с уровнем дерева 8 - размер индекса составляет около 600-700 МБ.

Помните, что какой бы уровень дерева вы ни выбрали, вы всегда рискуете получить ложные срабатывания, поскольку геохэш никогда не будет на 100% точным представлением вашей фигуры. Это компромисс между точностью и производительностью, а geohash - мудрый выбор производительности.

Другие вопросы по тегам