Это не безопасный подход. Я легко могу представить ситуацию, которая может не сработать:
State of Rtree с 2 полями перед вставкой новой:
(0,2) --- (1,2)
| b |
(0,1) --- (1,1)
| a |
(0,0) --- (1,0)
, поэтому у нас есть 2 коробки a
и b
. Теперь вы вызываете nearest
prediacte с 1 как количество результатов, когда вы пытаетесь вставить новое поле ввода с такой же геометрией, как у поля a
. distance
между входной геометрией и a
равно 0, но 0 также для distance(input,b)
. nearest
ограничено возвращать только одну коробку - какая? вы не знаете, если он возвращает поле b
, вы вставляете дубликат a
в Rtree.
Безопасный метод может быть следующим:
- получить новое поле ввода
- вычислить его центроид
- получить ВСЕ ящики от rtree, содержащие входной центроид
- переберите возвращенные поля и вызовите функцию
equals
для пары (поле из rtee, поле ввода)
Для этого вы можете использовать , содержащий предикат , который использует boost :: geometry :: within метод. В качестве ввода contains/within
вы передаете point-centroid, если он отбрасывается компилятором (я не уверен, что он может взять точку), вы можете расширить point-centroid в маленькое поле для компиляции.