Зажечь только ограничивающую рамку поиска

Я пытаюсь использовать поиск по геометрии apache ignite, применяя пример почти так, как указано в https://github.com/dmagda/geospatial/blob/master/src/main/java/org/geospatial/SpatialQueryExample.java

Однако поиск выглядит так, будто он учитывает не многоугольник, а скорее ограничивающую рамку многоугольника.

Я подаю заявку:

SqlQuery<Long, EndDevicePosition> query = new SqlQuery<>(EndDevicePosition.class, "devEUI=? and geoCoordinates && ?");
    query.setArgs(devEUI, "POLYGON(("+long1+" "+lat1+", "+long2+" "+lat2+", "+long3+" "+lat3+", "+long4+" "+lat4+", "+long1+" "+lat1+"))");

    Collection<Entry<Long, EndDevicePosition>> entries = endDevicePosition.query(query).getAll();

по данным:

lat1    48.93677638153757
lat2    48.935514830810355
lat3    48.9355007350914
lat4    48.93569455087813
long1   2.242525877426105
long2   2.2392808748500586
long3   2.240080057302674
long4   2.241281512801883

Хотя это проекция WGS84, это не должно влиять на результат.

Наглядный пример результатов

Я делаю это неправильно, и есть ли способ получить реальный многоугольник? Спасибо.


person Cojy    schedule 04.09.2018    source источник


Ответы (1)


Это ожидаемое поведение: оператор && означает именно bounding box intersection. Это самая общая пространственная операция, и она может использовать пространственный индекс.

Вам нужен дополнительный фильтр в запросе, подобном следующему:

geoCoordinates && ? AND my_custom_geo_filter(geoCoordinates, ?)

где в функции my_custom_geo_filter вы можете использовать все возможности библиотеки JTS.

По умолчанию Ignite не определяет какие-либо гео-функции в SQL, поэтому вам нужно сделать это вручную, используя аннотацию QuerySqlFunction[1]. См. https://ignite.apache.org/releases/latest/javadoc/org/apache/ignite/cache/query/annotations/QuerySqlFunction.html

person Sergi Vladykin    schedule 13.09.2018
comment
Верно! Однако я думаю, что пользовательские методы необходимо добавить в банку, загружаемую apache ignite при запуске. - person Cojy; 14.09.2018