Geoserver - фильтрация точек с помощью DWITHIN

Прежде всего, я новичок в Geoserver и Openlayers. Я пытался заставить это работать на стороне Geoserver, используя страницу предварительного просмотра слоя, чтобы просмотреть мой слой с помощью средства просмотра Openlayer. В конце концов, я бы реализовал это как запрос Openlayers WFS GET.

То, что я пытаюсь выполнить, - это вернуть функции, которые находятся на определенном расстоянии от разных точек. (т.е. в пределах 5 км от школы)

Я использую страницу предварительного просмотра слоя на Geoserver. Я добавил фильтр CQL «DWITHIN (GEOM, POINT (-60,2 46,1), 0,05, километры)». Он ограничил количество возвращаемых баллов, но я не уверен, правильно ли он фильтрует.

Мои вопросы заключаются в следующем:

  1. Насколько я понимаю, из-за этой ошибки http://jira.codehaus.org/browse/GEOS-937 Я должен использовать градусы для своей единицы измерения. Как я могу преобразовать на стороне клиента, используя javascript/openlayers 3, чтобы изменить 5 км на значение градуса?
  2. Могу ли я добавить несколько фильтров DWITHIN, чтобы определить, находится ли точка в пределах 5 км от одной точки и 10 км от другой?
  3. Могу ли я фильтровать по типу объекта? т.е. точка возврата в пределах 5 км от школы и 10 км от больницы

person Steve    schedule 19.05.2015    source источник


Ответы (1)


Проведя некоторое время с этим, я смог ответить на свой вопрос.

Прежде всего, проведя некоторые поиски, я определил, что 1 градус = 111,325 км примерно. https://answers.yahoo.com/question/index?qid=20060905051639AAWGjH9

Чтобы добавить несколько фильтров DWITHIN, все, что вам нужно сделать, это добавить И между каждым из них. Если он в формате WFS, возможно, вам придется добавить %20AND%20, чтобы включить пробелы.

Чтобы сделать DWITHIN определенного места, вы должны добавить следующее в свой файл wfs. Точка - это долгота / широта, 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, так что это может работать не во всех случаях, но я так понял. Думаю, в разных проекциях могут быть какие-то изменения. Надеюсь, это поможет вам встать на правильный путь.

person Steve    schedule 22.05.2015
comment
Ницца. Просто обратите внимание, что 1 градус широты = 111,325 км (т.е. длина окружности земли / 360°). С другой стороны, 1° долготы соответствует только экватору. Видя, как линии широты (которые вы пересекаете при изменении долготы) становятся все ближе и ближе по мере того, как вы достигаете северного или южного полюса, 1° долготы = (окружность земли / 360°) * cos (широта, где вы находитесь). ). - person Reversed Engineer; 19.01.2016
comment
например в Нью-Йорке (широта около 40,7° северной широты) 1 градус долготы составляет всего 84,38 км. Иногда (часто) картографы ошибочно проецируют градус широты и долготы как одно и то же расстояние, например. прямоугольники в реальном мире не являются прямоугольными на карте и т.д. на docs.geoserver.org/latest/en/user/_images/lp_1 .png - person Reversed Engineer; 19.01.2016