Existe-t-il une solution FOSS pour l'analyse des légendes dans un environnement de cartographie Web?

14

Nos exigences de cartographie Web sont assez standard - certaines requêtes de base et la possibilité d'imprimer la carte résultante (ou enregistrer l'image). En règle générale, nous avons utilisé des produits ESRI dans le passé (en ce moment, nous utilisons GeoCortex), mais nous n'avons toujours pas été en mesure de résoudre le problème de l'analyse des informations de légende pour qu'elles correspondent à ce qui est réellement affiché sur la carte. Par exemple, s'il y a quatre polygones sur la carte, il ne devrait y avoir que quatre éléments de légende pour les polygones. Existe-t-il une solution open source pour ce problème?

EDIT : Voyons si je peux clarifier cela davantage. Actuellement, nous avons une couche géologique avec plus de 33 000 polygones. La légende de cette couche est une image unique et contient plusieurs centaines d'éléments de légende (c'est-à-dire que c'est la légende de la couche géologique entière, stockée dans un fichier JPEG / PNG).

En règle générale, un utilisateur effectuera un zoom avant sur une zone (telle qu'une feuille de carte NTS, ou même plus petite) et un sous-ensemble de polygones géologiques sera donc affiché à l'écran. Ils enregistreront ensuite la carte en tant que document imprimé (PDF ou image), qui est généré par GeoCortex / ArcGIS Server. Le document imprimé contiendra un en-tête, une image de la carte et une légende. Cependant, la légende de la couche géologique sera la légende de la couche géologique entière , pas celle qui est réellement affichée sur la carte (c'est-à-dire un sous-ensemble beaucoup plus petit).

Donc, je cherche à voir s'il existe une solution FOSS pour me permettre d'extraire ou de générer à la volée un sous-ensemble de la légende de la géologie qui reflète les éléments réels à l'écran / sur la carte, pour accompagner le document imprimé . J'espère que cela clarifie les choses; Je m'excuse si ce n'est pas le cas!

ollyoop
la source
1
Salut ollyoop, j'ai du mal à imaginer le résultat souhaité. Pouvez-vous inclure un exemple de mauvaise légende et un exemple de bonne légende? Je pense que cela pourrait m'aider ou aider les autres à donner une réponse. Merci
andytilia
cette fonctionnalité a été incluse dans le serveur Arcgis 10.1, je l'ai vue lors d'une présentation d'ESRI.
geogeek
Hmmm, eh bien, nous verrons comment cela fonctionne. En attendant, existe-t-il des solutions FOSS?
ollyoop
1
Basé sur FOSS ou ESRI, il semble que vous aurez besoin d'un code personnalisé.
Ragi Yaser Burhum
Certes , Latitude Geographics peuvent le faire. En avez-vous parlé avec eux (que ce soit déjà dans Geocortex Essentials ou s'ils envisagent de le mettre en œuvre)?
Chad Cooper

Réponses:

3

Il est définitivement possible de faire ce que l'on veut, selon certaines conditions. Jetez un œil à cette application Flex que j'avais développée il y a quelques années: http://india-wris.nrsc.gov.in/LULCApp.html .

La légende et les statistiques changent en fonction des données visibles dans l'étendue actuelle. L'algorithme requiert que chacune des classes ait une couleur distincte. L'application Flex connaît la classe et sa couleur. À chaque changement d'étendue, il convertit l'étendue de la carte actuelle en bitmap, puis y trouve les couleurs. En utilisant cela, vous pouvez découvrir quelles couleurs ou classes sont actuellement visibles. Sur la base de ces informations, la légende est créée dynamiquement.

J'avais utilisé Flex à l'époque, mais cela est également possible en utilisant le Canvas en HTML5. Ou vous pouvez utiliser n'importe quel code côté serveur pour faire la même chose avec votre image de carte afin d'obtenir votre légende créée dynamiquement.

Devdatta Tengshe
la source
C'est exactement ça! Super de voir un exemple en pratique. Très appréciée!!!
ollyoop
5

AFAIK, dans FOSS4G ou ESRI, vous devrez écrire du code personnalisé pour générer cette couche.

Ce n'est pas si difficile, mais cela vous prendra plus que quelques lignes de code.

Pour ArcMap, cela s'effectue à l'aide d'un élément personnalisé . Le site d'aide ESRI est rempli d' anciens exemples et de nouveaux exemples .

Dans le passé, j'ai accompli quelque chose de similaire à ce que vous avez décrit en utilisant Pagelayout Frame Elements .

Si vous n'avez jamais fait ArcObjects (mais que vous avez programmé), le code de dessin peut devenir un peu délicat, mais il faut généralement en créer un pour atteindre ce "aha!" moment.

L'algorithme est simple:

  • (1) Obtenez l' objet Carte du PageLayout que vous souhaitez utiliser comme référence pour générer la légende ... Vous devrez peut-être gérer plusieurs cadres pour atteindre la carte que vous souhaitez, car un Pagelayout peut contenir plusieurs objets Carte avec différents étendues, ce qui est un peu inhabituel si vous n'avez pas effectué de programmation ArcMap Pagelayout personnalisée (pensez aux petites cartes en encart que vous pouvez avoir).

  • (2) Saisissez l' étendue visible de l'ActiveView de la carte souhaitée.

  • (3) l' utiliser comme la géométrie du filtre de requête à la boucle et la recherche à travers toutes les couches de la carte.

  • (4) Si la couche renvoie des enregistrements, vous devez la dessiner comme indiqué dans les exemples que je vous ai donnés auparavant.

Désolé, je ne peux pas vous offrir une solution plus simple, mais au moins de cette façon, vous pourrez le faire ressembler comme vous le souhaitez - juste un codage requis.

Mise à jour:

Puisque vous vouliez le faire dans le contexte d'une application Web, j'ai vérifié la documentation et il existe plusieurs façons de le faire en utilisant un algorithme similaire.

L'un d'eux se fait via une extension d'objet ArcGIS Server . Vous feriez toutes les étapes sauf (1) (pas besoin de vous soucier de Pagelayout dans ce contexte). Exposez le résultat à l'aide de REST.

À partir de là, vous avez plusieurs options (selon que vous souhaitez utiliser Flex ou Javascript), mais l'idée est la même - actualiser la page appelez le service Web REST que vous avez créé et dessinez la légende.

L'avantage de cette approche par rapport aux autres qui ont été suggérées est que vous pouvez utiliser n'importe quelle symbologie avec vos entités (et que vous ne vous limitez pas à des couleurs distinctes pour la symbologie de l'entité). Vous pouvez utiliser votre langue Web préférée pour le code côté client. Les symboles que vous générez pour la légende peuvent être générés automatiquement à partir de la carte.

L'inconvénient est que vous devrez écrire une extension d'objet serveur! Heureusement, il existe un échantillon ESRI qui fait déjà 75% de ce dont vous avez besoin et devrait vous donner une idée claire de la façon de continuer avec les commentaires que j'ai faits ci-dessus.

Mise à jour 2: En ce qui concerne une solution FOSS4G à cela, la même approche fonctionnerait également avec n'importe lequel des serveurs FOSS, bien que l'API soit légèrement différente pour chacun.

Ragi Yaser Burhum
la source
1
Merci beaucoup pour la réponse! Il existe un outil appelé Legend Limiter qui le fait déjà pour l'environnement ArcGIS. Ce que je cherche à faire, c'est de transférer cette capacité dans le monde de la cartographie Web.
ollyoop
@ollyoop Au moins jusqu'à la 9.3, je sais que cette même approche aurait parfaitement fonctionné pour ArcGIS Server. Je sais qu'il y a eu des changements significatifs dans l'architecture de rendu du serveur depuis 9.3, et je dois admettre que je n'ai pas suivi. Je serais surpris si des éléments personnalisés étaient retirés de la version 10.1.
Ragi Yaser Burhum
@ollyoop a ajouté une approche qui fonctionnerait avec ArcGIS Server
Ragi Yaser Burhum
3

Lorsque vous exportez vers un PDF avec Geocortex Essentials, la légende est générée par un sous-rapport dans le modèle d'impression. Ce sous-rapport reçoit toutes les couches visibles qui ont été utilisées pour créer l'image de la carte et tous les échantillons de légende produits par ArcGIS Server. Il n'émet aucune requête spatiale pour déterminer si des couches de la légende sont réellement dessinées à l'étendue de la zone imprimée.

Ainsi, si vous souhaitez modifier le comportement de la légende, vous pouvez personnaliser le sous-rapport de légende ou utiliser une image au lieu d'un sous-rapport pour insérer une légende dans le modèle d'impression. Si vous générez déjà une image de légende à utiliser dans votre visionneuse, vous devriez pouvoir réutiliser ce service à partir du moteur d'impression.

La légende contient déjà du code intégré incorporé qui bascule la mise en forme du texte de la légende selon que l'échantillon est pour un calque ou pour une classe du calque. Vous pouvez voir le code en ligne lorsque vous passez à l'onglet "Script" dans le concepteur de rapports.

(Je travaille chez Latitude Geographics)

mwalker
la source
1

À propos de la "cartographie Web" avec la "solution FOSS" complète ... Considérations:

  • La «solution FOSS» doit être «populaire» (avoir une grande communauté organisée) pour être sûre, stable, etc.
  • Un concept clé des logiciels libres et SIG est la normalisation : les meilleures solutions adoptent des normes, comme celles de l' OGC .
  • Aujourd'hui, les «solutions Web» populaires sont OpenLayers, Mapserver, GeoServer, PostGIS, etc. Tout ce qu'elles ont est un noyau compatible OGC. La solution "GeoCortex / ArcGIS Server" n'est pas FOSS, mais peut-être conforme OGC.

Et considération technique: vous utilisez des "couvertures" (?), Donc un bon standard OGC pour récupérer vos informations spatiales est le WMS .


Une solution simple conforme à l'OGC à votre problème consiste à utiliser les services WMS GetCapabilities et GetLegendGraphic , qui renvoient une description de légende standard dans un fichier XML et l'image avec des légendes.

REMARQUE: lorsque vous pensez à une solution SIG / FOSS, vous pouvez d'abord penser aux normes, puis le problème est réduit à un "problème de pièces LEGO bien connu", et les pièces proviennent de n'importe quel fournisseur.

ArcGIS 10+ possède GetLegendGraphic , mais vérifiez si vous pouvez spécifier BBOX pour afficher uniquement un sous-ensemble de légendes.


Si vous voulez construire une disposition de carte avec une légende , il y a d'autres morceaux de cette "solution FOSS LEGO":

Tout serveur de carte FOSS, comme MapServer (et je pense que les solutions ESRI aussi), peuvent offrir une image JPEG en tant que demande de carte WMS (non carrelée) - voir le service GetMap de WMS .

PS: ce n'est pas un standard, mais peut-être que votre serveur peut être configuré pour offrir une carte avec légende , par des outils de modèle, comme MapServer.

Pour construire une mise en page de "carte avec légende", vous pouvez générer un HTML (ou "fichier PDF à la volée") avec Javascript, PHP ou une autre langue qui effectue les demandes de service Web (REST) pour carte et légende.

Je préfère générer des PDF à partir de HTML: vous pouvez utiliser wkHtmlToPdf , une solution FOSS pour les conversions HTML-PDF. Pour produire des mises en page plus pauvres, avec la "mise en page JPEG à la volée", vous pouvez utiliser une boîte à outils FOSS standard, comme imagemagick , sur le serveur.

Peter Krauss
la source