Czy istnieje rozwiązanie FOSS do analizowania legend w środowisku mapowania sieci?

14

Nasze wymagania dotyczące mapowania są dość standardowe - niektóre podstawowe zapytania i możliwość wydrukowania wynikowej mapy (lub zapisania obrazu). Zazwyczaj korzystaliśmy z produktów ESRI w przeszłości (obecnie korzystamy z GeoCortex), ale nadal nie byliśmy w stanie rozwiązać problemu, w jaki sposób analizować informacje o legendzie, aby pasowały do ​​tego, co faktycznie jest wyświetlane na mapie. Na przykład, jeśli na mapie pojawiają się cztery wielokąty, powinny być tylko cztery elementy legendy dla wielokątów. Czy istnieje rozwiązanie typu open source dla tego problemu?

EDYCJA : Zobaczmy, czy mogę to wyjaśnić bardziej. Obecnie mamy warstwę geologiczną z ponad 33 000 wielokątów. Legenda dla tej warstwy jest pojedynczym obrazem i zawiera kilkaset elementów legendy (tj. Jest to legenda dla całej warstwy geologicznej, przechowywana w formacie JPEG / PNG).

Zazwyczaj użytkownik powiększa obszar (taki jak pojedynczy arkusz mapy NTS lub nawet mniejszy), a więc podzbiór wielokątów geologicznych będzie wyświetlany na ekranie. Następnie zapiszą mapę jako wydrukowany dokument (PDF lub obraz), który jest generowany przez GeoCortex / ArcGIS Server. Wydrukowany dokument będzie zawierał nagłówek, obraz mapy i legendę. Jednak legenda dla warstwy geologicznej będzie legendą dla całej warstwy geologicznej, a nie tym, co faktycznie pokazano na mapie (tj. Znacznie mniejszym podzbiorze).

Szukam więc rozwiązania FOSS, które umożliwi mi wycięcie lub wygenerowanie w locie podzbioru legendy geologii, który odzwierciedla rzeczywiste elementy na ekranie / na mapie, aby przejść z drukowanym dokumentem . Mam nadzieję, że to wyjaśnia; Przepraszam, jeśli nie!

ollyoop
źródło
1
Cześć ollyoop - Trudno mi wyobrazić sobie pożądany rezultat. Czy możesz podać przykład złej legendy i przykład dobrej legendy? Myślę, że to może pomóc mi lub innym udzielić odpowiedzi. Dzięki
andytilia,
ta funkcja została uwzględniona na serwerze Arcgis 10.1, widziałem ją podczas prezentacji ESRI.
geogeek
Hmmm, cóż, zobaczymy, jak to się naprawdę ułoży. Czy w międzyczasie są jakieś rozwiązania FOSS?
ollyoop,
1
Na podstawie FOSS lub ESRI wygląda na to, że będziesz potrzebować niestandardowego kodu.
Ragi Yaser Burhum
Z pewnością może to zrobić Geografia Latitude. Czy rozmawiałeś z nimi o tym (niezależnie od tego, czy jest już w Geocortex Essentials, czy planuje go wdrożyć)?
Chad Cooper

Odpowiedzi:

3

Z pewnością można robić, co chcesz, w zależności od określonych warunków. Spójrz na tę aplikację Flex, którą opracowałem kilka lat temu: http://india-wris.nrsc.gov.in/LULCApp.html .

Legenda i statystyki zmieniają się w zależności od danych widocznych w bieżącym zakresie. Algorytm wymaga, aby każda klasa miała inny kolor. Aplikacja Flex zna klasę i jej kolor. Przy każdej zmianie zasięgu konwertuje bieżący zasięg mapy na mapę bitową, a następnie wyszukuje w nim kolory. Za pomocą tego możesz dowiedzieć się, które kolory lub klasy są obecnie widoczne. Na podstawie tych informacji legenda jest tworzona dynamicznie.

W tym czasie korzystałem z Flex, ale jest to również możliwe przy użyciu Canvas w HTML5. Możesz też użyć dowolnego kodu po stronie serwera, aby zrobić to samo z obrazem mapy, aby uzyskać dynamicznie utworzoną legendę.

Devdatta Tengshe
źródło
Właśnie o to chodzi! Wspaniale jest zobaczyć przykład w praktyce. Bardzo mile widziane !!!
ollyoop,
5

AFAIK, w FOSS4G lub ESRI, musisz napisać niestandardowy kod, aby wygenerować tę warstwę.

To nie jest takie trudne, ale zajmie ci więcej niż kilka wierszy kodu.

W przypadku ArcMap odbywa się to za pomocą elementu niestandardowego . Witryna pomocy ESRI jest pełna starych przykładów i nowych przykładów .

W przeszłości osiągnąłem coś podobnego do tego, co opisałeś przy użyciu elementów ramowych Pagelayout .

Jeśli nigdy nie robiłeś ArcObjects (ale programowałeś), kod rysunkowy może być nieco trudny, ale zwykle potrzeba zrobienia jednego, aby osiągnąć „aha!” za chwilę.

Algorytm jest prosty:

  • (1) Pobierz obiekt Map PageLayout , którego chcesz użyć jako odniesienie do wygenerowania legendy ... Być może będziesz musiał poradzić sobie z wieloma ramkami, aby dotrzeć do wybranej mapy, ponieważ Pagelayout może zawierać kilka obiektów Map o różnych zakresy, co jest nieco nietypowe, jeśli nie wykonałeś żadnego niestandardowego programowania ArcMap Pagelayout (pomyśl o małych mapkach, które możesz mieć).

  • (2) Chwyć widoczny zakres ActiveView wybranej mapy.

  • (3) Zastosowanie że jako filtra zapytania geometrii pętli i poszukiwanie przez wszystkie warstwy na mapie.

  • (4) Jeśli warstwa zwróci jakieś rekordy, musisz je narysować, jak pokazano w przykładach, które ci dałem wcześniej.

Niestety nie mogę zaoferować prostszego rozwiązania, ale przynajmniej w ten sposób będziesz w stanie wyglądać tak, jak chcesz - wystarczy kodowanie.

Aktualizacja:

Ponieważ chciałeś to zrobić w kontekście aplikacji internetowej, sprawdziłem dokumentację i istnieje kilka sposobów, aby to zrobić przy użyciu podobnego algorytmu.

Jednym z nich jest rozszerzenie ArcGIS Server Object Extension . Zrobiłbyś wszystkie kroki oprócz (1) (w tym kontekście nie musisz się martwić o Pagelayout). Ujawnij wynik za pomocą REST.

Odtąd masz kilka opcji (w zależności od tego, czy chcesz używać Flexa, czy Javascript), ale pomysł jest taki sam - na stronie odświeżanie wywołaj utworzoną usługę REST i narysuj legendę.

Zaletą tego podejścia w porównaniu z innymi, które zostały zasugerowane, jest możliwość użycia dowolnej symboliki ze swoimi funkcjami (i nie są ograniczone do odrębnych kolorów dla symboliki funkcji). Możesz użyć swojego ulubionego języka internetowego dla kodu po stronie klienta. Symbole, które generujesz dla legendy, można automatycznie wygenerować z mapy.

Wadą jest to, że będziesz musiał napisać rozszerzenie obiektu serwera! Na szczęście istnieje próbka ESRI, która robi 75% tego, czego już potrzebujesz, i powinna dać ci jasny pomysł, jak kontynuować z komentarzami, które napisałem powyżej.

Aktualizacja 2: Jeśli chodzi o rozwiązanie FOSS4G, to samo podejście działałoby również z dowolnym serwerem FOSS, choć interfejs API jest nieco inny dla każdego z nich.

Ragi Yaser Burhum
źródło
1
Dziękuję bardzo za odpowiedź! Istnieje narzędzie o nazwie Legend Limiter, które już to robi w środowisku ArcGIS. Chcę przenieść tę zdolność do świata map internetowych.
ollyoop,
@ollyoop Przynajmniej do 9.3 wiem, że to samo podejście działałoby całkowicie dobrze dla ArcGIS Server. Wiem, że nastąpiły znaczące zmiany w architekturze renderowania serwerów od wersji 9.3 i co prawda nie nadążyłem za tym. Byłbym zaskoczony, gdyby elementy niestandardowe zostały wyciągnięte z wersji 10.1.
Ragi Yaser Burhum
@ollyoop dodał podejście, które działałoby z ArcGIS Server
Ragi Yaser Burhum
3

Podczas eksportowania do pliku PDF za pomocą Geocortex Essentials legenda jest generowana przez podraport w szablonie wydruku. Ten podraport odbiera wszystkie widoczne warstwy, które zostały użyte do utworzenia obrazu mapy oraz wszystkie próbki legendy wyprodukowane przez ArcGIS Server. Nie generuje żadnych zapytań przestrzennych w celu ustalenia, czy jakieś warstwy w legendzie są rzeczywiście rysowane w obszarze drukowanego obszaru.

Jeśli więc chcesz zmienić zachowanie legendy, możesz dostosować podraport legendy lub użyć obrazu zamiast podraportu, aby umieścić legendę w szablonie wydruku. Jeśli już generujesz obraz legendy do użycia w przeglądarce, powinieneś móc ponownie korzystać z tej usługi z silnika drukowania.

Legenda zawiera już część wbudowanego kodu wbudowanego, który przełącza formatowanie tekstu legendy w zależności od tego, czy próbka dotyczy warstwy, czy klasy w warstwie. Kod wewnętrzny można zobaczyć po przejściu na kartę „Skrypty” w projektancie raportów.

(Pracuję w Latitude Geographics)

mwalker
źródło
1

Informacje o „mapowaniu sieci” z pełnym „rozwiązaniem FOSS” ... Uwagi:

  • „Rozwiązanie FOSS” musi być „popularne” (mieć dużą i zorganizowaną społeczność), aby było bezpieczne, stabilne itp.
  • Kluczową koncepcją w FOSS i GIS jest normalizacja : najlepsze rozwiązania przyjmują standardy, takie jak OGC .
  • Obecnie popularnymi „rozwiązaniami internetowymi” są OpenLayers, Mapserver, GeoServer, PostGIS itp. Wszystkie mają rdzeń zgodny z OGC. Rozwiązanie „GeoCortex / ArcGIS Server” nie jest zgodne z FOSS, ale być może jest zgodne z OGC.

I uwaga techniczna: używasz „pokrycia” (?), Więc dobrym standardem OGC do wyszukiwania informacji przestrzennych jest WMS .


Prostym rozwiązaniem problemu , zgodnym z OGC , jest użycie usług WMS GetCapabilities i GetLegendGraphic , które zwracają standardowy opis legendy do pliku XML oraz obrazu z legendami.

UWAGA: kiedy myślisz o jakimś rozwiązaniu GIS / FOSS, możesz najpierw pomyśleć o standardach, a następnie problem zostaje zredukowany do „dobrze znanego problemu z klockami LEGO”, a elementy pochodzą od dowolnego dostawcy.

ArcGIS 10+ ma GetLegendGraphic , ale sprawdź, czy możesz określić BBOX, aby pokazywał tylko podzbiór legend.


Jeśli chcesz zbudować układ mapy z legendą , istnieją inne elementy tego „rozwiązania LEGO FOSS”:

Każdy serwer map FOSS, taki jak MapServer (i myślę, że również rozwiązania ESRI), może zaoferować obraz JPEG jako żądanie mapy WMS (bez kafelków) - patrz usługa GetMap WMS .

PS: nie jest to standard, ale być może twój serwer może być skonfigurowany do oferowania mapy z legendą , za pomocą narzędzi szablonów, takich jak MapServer.

Aby zbudować układ „mapy z legendą”, możesz wygenerować HTML (lub „plik PDF w locie”) za pomocą Javascript, PHP lub innego języka, który wykonuje żądania usługi internetowej (REST) dla mapy i legendy.

Wolę generować PDF z HTML: możesz użyć wkHtmlToPdf , rozwiązania FOSS do konwersji HTML-to-PDF. Aby uzyskać gorsze układy, za pomocą układu „on fly fly JPEG”, możesz użyć standardowego zestawu narzędzi FOSS, takiego jak imagemagick , na serwerze.

Peter Krauss
źródło