Geoserver - фильтрация точек с использованием DWITHIN
Прежде всего, я новичок в Geoserver и Openlayers. Я пытался заставить это работать на стороне Geoserver, используя страницу предварительного просмотра Layer, чтобы просмотреть мой слой, используя средство просмотра Openlayer. В конце я бы реализовал его как запрос GET от Openlayers WFS.
Я пытаюсь вернуть функции, которые находятся на определенном расстоянии от разных точек. (т.е. в пределах 5 км от школы)
Я использую страницу предварительного просмотра слоя на Geoserver . Я добавил фильтр CQL "DWITHIN(GEOM, POINT(-60.2 46.1), 0.05, километры)". Он ограничил количество очков, которые были возвращены, но я не уверен, правильно ли он фильтрует.
Мои вопросы следующие:
- Из моего понимания из-за этой ошибки http://jira.codehaus.org/browse/GEOS-937 я должен использовать градусы для моего устройства. Как я могу конвертировать на стороне клиента, используя javascript/openlayers 3, чтобы преобразовать 5 км в градус?
- Могу ли я добавить несколько фильтров DWITHIN, чтобы указать, находится ли точка в 5 км от одной точки и в 10 км от другой?
- Могу ли я фильтровать по типу объекта? т.е. точка возврата в 5 км от школы и в 10 км от больницы
1 ответ
Проведя некоторое время с этим, я смог ответить на свой вопрос.
Прежде всего, проведя поиск, я определил приблизительно 1 градус = 111,325 км. https://answers.yahoo.com/question/index?qid=20060905051639AAWGjH9
Чтобы добавить несколько фильтров DWITHIN, все, что вам нужно сделать, это добавить AND между ними. Если он в формате WFS, возможно, вам придется добавить%20AND%20, чтобы пробелы были включены.
Чтобы сделать DWITHIN определенного местоположения, вы должны добавить следующее к вашим wfs. Точка - это long/lat, 0,05 - это градусы от точки, километры - это единица измерения, которая передается. При использовании геосервера он по умолчанию задается в градусах, как указано в исходном вопросе.
&CQL_FILTER=DWITHIN(GEOM,Point(-60.2 46.1),0.05,kilometers)
Это вернет все функции из вашего слоя WFS, которые находятся в пределах градусов от указанной точки.
Чтобы отфильтровать другой слой, я использовал информацию со следующего URL http://docs.geoserver.org/2.6.x/en/user/extensions/querylayer/index.html
Во-первых, вы должны установить соответствующий модуль querylayer для вашей версии Geoserer, как указано в ссылке.
Чтобы сделать фильтр на основе имени функции, я использовал следующий CQL_filter:
&CQL_FILTER=DWITHIN(GEOM,collectGeometries(queryCollection('Workspace:AssetLayer','GEOM','AssetTypeID=1')),
.02,kilometers%29
Это вернет все объекты запрашиваемого слоя WFS, которые находятся в пределах градусов, указанных для объекта с AssetID 1 из уровня "Рабочая область:AssetLayer".
т. е. если школа имеет AssetTypeID, равный 1, то будут возвращены все функции исходного слоя, которые находились в пределах 0,02 градуса от школы в слое "Рабочая область:AssetLayer".
Значение "GEOM" должно быть именем столбца, который содержит ваши данные геометрии в SQL.
Кроме того, я закодировал последнюю круглую скобку в CQL_Filter "%29", потому что обнаружил, что при выполнении запроса через openlayers он удаляет его.
Как я уже сказал, я новичок в openlayers/geoserver, так что это может не сработать в каждом случае, но так я понял. Я думаю, что в разных проекциях могут быть некоторые изменения. Надеюсь, что это поможет вам на правильном пути.