Существует ли решение FOSS для разбора легенды в среде веб-картографии?

14

Наши требования к веб-картографии достаточно стандартны - некоторые базовые запросы и возможность распечатать получившуюся карту (или сохранить изображение). Обычно мы использовали продукты ESRI в прошлом (сейчас мы используем GeoCortex), но мы до сих пор не смогли решить проблему того, как анализировать информацию легенды, чтобы она соответствовала тому, что на самом деле отображается на карте. Например, если на карте отображаются четыре полигона, для полигонов должно быть только четыре элемента легенды. Есть ли решение этой проблемы с открытым исходным кодом?

РЕДАКТИРОВАТЬ : Давайте посмотрим, смогу ли я уточнить это больше. В настоящее время у нас есть геологический слой с более чем 33 000 полигонов. Легенда для этого слоя представляет собой одно изображение и содержит несколько сотен элементов легенды (т. Е. Это легенда для всего геологического слоя, хранящегося в формате JPEG / PNG).

Как правило, пользователь увеличивает масштаб области (например, один лист карты NTS или даже меньше), поэтому на экране будет отображаться подмножество геологических полигонов. Затем они сохранят карту в виде печатного документа (PDF или изображение), сгенерированного GeoCortex / ArcGIS Server. Печатный документ будет содержать заголовок, изображение карты и легенду. Однако легенда для геологического слоя будет легендой для всего геологического слоя, а не того, что на самом деле показано на карте (т. Е. Гораздо меньшего подмножества).

Итак, я смотрю, есть ли решение FOSS, которое позволило бы мне вырезать или сгенерировать на лету подмножество легенд геологии, которые отражают фактические элементы на экране / на карте, чтобы идти с распечатанным документом , Я надеюсь, что это проясняет ситуацию; Я прошу прощения, если это не так!

ollyoop
источник
1
Привет, ollyoop. Мне трудно представить, какой ты желаемый результат. Можете ли вы привести пример плохой легенды и пример хорошей легенды? Я думаю, что это может помочь мне или другим дать ответ. Спасибо ...
Andytilia
эта функция была включена в Arcgis server 10.1, я видел ее во время презентации ESRI.
Geogeek
Хммм, хорошо, мы посмотрим, как это на самом деле работает. Между тем, есть ли решения FOSS?
ollyoop
1
По-видимому, на основе FOSS или ESRI вам понадобится специальный код.
Раги Язер Бурхум
Конечно, Широта География может сделать это. Говорили ли вы с ними об этом (независимо от того, входит ли оно в Geocortex Essentials или планирует ли оно его реализовать)?
Чед Купер

Ответы:

3

Определенно можно делать то, что вы хотите, в зависимости от определенных условий. Взгляните на это Flex-приложение, которое я разработал пару лет назад: http://india-wris.nrsc.gov.in/LULCApp.html .

Легенда и статистика меняются в зависимости от данных, видимых в текущем экстенте. Алгоритм требует, чтобы у каждого класса был свой цвет. Приложение Flex знает класс и его цвет. При каждом изменении экстента он конвертирует текущий экстент карты в растровое изображение, а затем выясняет цвета в нем. Используя это, вы можете узнать, какие цвета или классы в настоящее время видны. На основании этой информации легенда создается динамически.

В то время я использовал Flex, но это также возможно при использовании Canvas в HTML5. Или вы можете использовать любой код на стороне сервера, чтобы сделать то же самое с изображением карты, чтобы получить динамически создаваемую легенду.

Девдатта Тенгше
источник
Это именно так! Приятно видеть пример на практике. Очень признателен!!!
ollyoop
5

AFAIK, в FOSS4G или ESRI вам нужно написать собственный код для генерации этого слоя.

Это не что трудно, но это займет у вас больше , чем несколько строк кода.

Для ArcMap это достигается с помощью пользовательского элемента . Справочный сайт ESRI заполнен старыми и новыми примерами .

В прошлом я делал нечто похожее на то, что вы описали, используя Pagelayout Frame Elements .

Если вы никогда не делали ArcObjects (но программировали), код рисования может быть немного сложным, но обычно требуется один, чтобы достичь этого «ага!» момент.

Алгоритм прост:

  • (1) Получите объект Map из PageLayout, который вы хотите использовать в качестве ссылки для создания легенды ... Возможно, вам придется иметь дело с несколькими фреймами, чтобы добраться до нужной карты, потому что Pagelayout может содержать несколько объектов Map с разными экстенты, что немного необычно, если вы не занимались программированием ArcMap Pagelayout (подумайте о маленьких картах-врезках, которые вы можете иметь).

  • (2) Возьмите видимый экстент ActiveView карты, которую вы хотите.

  • (3) Используйте это в качестве геометрии фильтра запросов для циклического поиска и поиска по всем слоям на карте.

  • (4) Если слой возвращает какие-либо записи, вы должны нарисовать его, как показано в примерах, которые я дал вам ранее.

Извините, я не могу предложить вам более простое решение, но, по крайней мере, таким образом вы сможете заставить его выглядеть так, как вы хотите - просто кодирование требуется.

Обновить:

Поскольку вы хотели сделать это в контексте веб-приложения, я проверил документацию, и есть несколько способов сделать это, используя аналогичный алгоритм.

Одним из них является расширение объекта сервера ArcGIS . Вы должны сделать все шаги, кроме (1) (не нужно беспокоиться о Pagelayout в этом контексте). Выставьте результат, используя REST.

Отсюда у вас есть несколько вариантов (в зависимости от того, хотите ли вы использовать Flex или Javascript), но идея та же - при обновлении страницы вызовите созданный вами веб-сервис REST и нарисуйте легенду.

Преимущество этого подхода по сравнению с другими, которые были предложены, состоит в том, что вы можете использовать любые символы с вашими функциями (и не ограничиваться отдельными цветами для символов функции). Вы можете использовать свой любимый веб-язык для кода на стороне клиента. Символы, которые вы генерируете для легенды, могут быть автоматически созданы на карте.

Недостатком является то, что вам нужно написать расширение объекта сервера! К счастью, есть образец ESRI, который уже делает 75% того, что вам нужно, и должен дать вам четкое представление о том, как продолжить комментарии, которые я сделал выше.

Обновление 2: Что касается решения FOSS4G, то тот же подход будет работать и с любым из серверов FOSS, хотя API немного отличается для каждого.

Раги Язер Бурхум
источник
1
Большое спасибо за ответ! Существует инструмент под названием Legend Limiter, который уже делает это для среды ArcGIS. Я собираюсь перенести эту способность в мир веб-картографии.
ollyoop
@ollyoop По крайней мере до 9.3, я знаю, что этот же подход вполне бы работал для ArcGIS Server. Я знаю, что с 9.3 произошли значительные изменения в архитектуре рендеринга сервера, и я, правда, не поспевал за этим. Я был бы удивлен, если бы пользовательские элементы были вырваны из 10.1, хотя.
Раги Язер Бурхум
@ollyoop добавил подход, который будет работать с ArcGIS Server
Ragi Yaser Burhum
3

При экспорте в PDF с помощью Geocortex Essentials легенда генерируется вложенным отчетом в шаблоне печати. В этот подотчет поступают все видимые слои, которые использовались для создания изображения карты, и все образцы легенды, созданные ArcGIS Server. Он не выдает никаких пространственных запросов, чтобы определить, действительно ли какие-либо слои в легенде нарисованы в пределах области печати.

Таким образом, если вы хотите изменить поведение легенды, вы можете настроить подотчет легенды или использовать изображение вместо подотчета, чтобы поместить легенду в шаблон печати. Если вы уже каким-то образом генерируете изображение легенды для использования в своей программе просмотра, вы сможете повторно использовать этот сервис из механизма печати.

Легенда уже содержит некоторый встроенный встроенный код, который переключает форматирование текста легенды на основе того, предназначен ли образец для слоя или для класса в слое. Вы можете увидеть встроенный код при переходе на вкладку «Сценарии» в конструкторе отчетов.

(Я работаю в Локаторе Географии)

mwalker
источник
1

О "веб-картографировании" с полным "решением FOSS" ... Соображения:

  • «Решение FOSS» должно быть «популярным» (иметь большое и организованное сообщество), чтобы быть безопасным, стабильным и т. Д.
  • Ключевой концепцией в FOSS и GIS является стандартизация : лучшие решения используют стандарты, такие как OGC .
  • Сегодня популярными «веб-решениями» являются OpenLayers, Mapserver, GeoServer, PostGIS и т. Д. Все они имеют ядро, совместимое с OGC. Решение «GeoCortex / ArcGIS Server» не является FOSS, но, возможно, совместимо с OGC.

И техническое соображение: вы используете «покрытия» (?), Поэтому хорошим OGC-стандартом для получения вашей пространственной информации является WMS .


Простое решение OGC-совместимое с вашей проблемой , является использование WMS GetCapabilities и GetLegendGraphic услуги, которая возвращает стандартное описание легенды в файл XML, а также изображения с легендами.

ПРИМЕЧАНИЕ: когда вы думаете о каком-то решении GIS / FOSS, вы можете сначала подумать о стандартах, а затем проблема сводится к «хорошо известной проблеме кусочков LEGO», а кусочки принадлежат любому поставщику.

ArcGIS 10+ имеет GetLegendGraphic , но проверьте, можете ли вы указать BBOX для отображения только подмножества легенд.


Если вы хотите построить макет карты с легендами , есть еще одна часть этого «решения FOSS LEGO»:

Любая карта сервер FOSS, как MapServer (и я думаю , что решения ESRI тоже), могут предложить JPEG изображение как ЗЦЙ запросу карты (не черепица) - см Wms игрового GetMap обслуживание .

PS: это не стандарт, но, возможно, ваш сервер может быть настроен для предоставления карты с легендой с помощью инструментов шаблона, таких как MapServer.

Чтобы создать макет «карта с легендой», вы можете сгенерировать HTML (или «файл PDF на лету») с Javascript, PHP или другим языком, который выполняет (REST) запросы веб-службы для карты и легенды.

Я предпочитаю генерировать PDF из HTML: вы можете использовать wkHtmlToPdf , решение FOSS для преобразования HTML в PDF. Для создания более бедных макетов, используя «макет JPEG на лету», вы можете использовать стандартный набор инструментов FOSS, такой как imagemagick , на сервере.

Питер Краусс
источник