Зажечь только поиски ограничивающего прямоугольника - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь использовать поиск геометрии 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, это не должно влиять на результат.

Визуальный пример результатов

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

1 Ответ

0 голосов
/ 13 сентября 2018

Это ожидаемое поведение: оператор && означает ровно 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

...