4 votes

Comment styliser une couche WMS transparente superposée

Je réussis superposition d'une couche WMS dans google maps v3, cependant, comme les informations sur les tuiles sont en noir sur transparent, elles ne sont pas bien vues sur un fond sombre (comme la carte satellite), voir certaines tuiles par exemple :

http://geoportal2.uhul.cz/wms_oprl/?SERVICE=WMS&REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&LAYERS=HMLCR&FORMAT=image/png;%20mode=24bit&FGCOLOR=0xFF0000&TRANSPARENT=TRUE&SRS=EPSG:4326&BBOX=16.58935546875,49.37522008143603,16.600341796875,49.38237278700955&WIDTH=256&HEIGHT=256&STYLES=

( Le présent était le lien WMS pour récupérer cette tuile)

Question : comment modifier la demande WMS ci-dessus pour changer la couleur d'avant-plan (actuellement noire) en une couleur personnalisée (par exemple rouge) ? En d'autres termes, comment styliser le calque ? Le serveur est apparemment capable de le faire pour cette couche, puisqu'il est possible de le faire via leur application cartographique web (qui ne fonctionne que dans IE), où vous pouvez sélectionner la couleur. Voir l'exemple de cette image de carte :

enter image description here

( Le lien suivant a été utilisée pour récupérer l'image - notez qu'elle contient l'échelle et le logo, il ne s'agit donc pas d'une véritable tuile).

Malheureusement, cette application web n'utilise pas WMS pour obtenir cette carte stylisée et je ne peux donc pas copier les paramètres de stylisation dans la requête WMS. Je dois effectuer la mise en forme via la demande WMS. (parce que cet autre format de requête est propriétaire, récupère la carte entière - n'est pas conçu pour les tuiles - et ne semble pas prendre en charge les coordonnées WGS). comment faire ?

J'ai essayé :

  1. regarder le Documentation WMS , en particulier version 1.1.1
  2. regarder le SLDs mais cela semble assez complexe à comprendre...
  3. regarder le Sortie de la commande GetCapabilites pour le serveur WMS
  4. En outre, après avoir jeté un coup d'œil sur Décrire la couche y GetStyles les sorties de commande pour la couche que je souhaite (HLMCR) Je ne sais même pas si cette couche prendra en charge le stylisme par le biais du WMS...

Je me suis perdu, je vous serais reconnaissant de m'indiquer la bonne direction - ou de me dire s'il est possible de résoudre ce problème dans WMS (pour cette couche).

"Ce n'est pas possible" est également une réponse utile pour moi !

Merci d'avance.

2voto

jlivni Points 3197

A première vue, il semble qu'il s'agisse d'une implémentation de Mapserver 5.x, et getCapabilities indique que UserDefinedSymbolization SupportSLD="1" est activé au niveau de la carte, ce qui signifie que toutes les couches doivent en hériter.

En théorie, vous devriez donc pouvoir fournir le SLD soit dans la requête GET, soit dans un fichier quelque part, et fournir l'URL de votre SLD à la requête GET, et tout devrait être prêt.

L'écriture du SLD sera la partie la plus difficile, mais si vous pensez avoir un SLD qui devrait fonctionner mais qui ne fonctionne pas, collez-le ici.

0voto

Jpsy Points 2811

Utilisez un script qui lit l'image à partir du WMS et la recolore :

Enveloppe

Voici un exemple écrit en PHP :

<?php
$url = $_GET['url'];
$im = imagecreatefrompng($url);

if($im && imagefilter($im, IMG_FILTER_COLORIZE, 255, 0, 0, 0)){
    // this line is only needed if original image has transparency (32bit/pixel)
    // and you want to preserve that transparency
    imagesavealpha($im, true);

    header('Content-type: image/png');
    imagepng($im);
}else{
    echo 'Conversion failed.';
}

imagedestroy($im);
exit;
?>

Ensuite, au lieu d'appeler votre lien WMS, vous appelez le wrapper et passez le lien WMS en paramètre (recolor_png.php?url=...). Le wrapper lit l'image originale et renvoie un nouveau PNG avec une version colorisée. N'oubliez pas que le lien que vous passez en paramètre doit être urlencodé pour fonctionner correctement (tous les caractères spéciaux remplacés par leur notation hexagonale %XX). En JavaScript, vous pouvez le faire en utilisant la méthode encodeURIComponent().

Voici un exemple fonctionnel utilisant votre lien et le wrapper ci-dessus sur mon serveur :

http://www.digilog.de/pub/stackoverflow/recolor_png2.php?url=http%3A%2F%2Fgeoportal2.uhul.cz%2Fwms_oprl%2F%3FSERVICE%3DWMS%26REQUEST%3DGetMap%26SERVICE%3DWMS%26VERSION%3D1.1.1%26LAYERS%3DHMLCR%26FORMAT%3Dimage%2Fpng%3B%2520mode%3D24bit%26FGCOLOR%3D0xFF0000%26TRANSPARENT%3DTRUE%26SRS%3DEPSG%3A4326%26BBOX%3D16.58935546875%2C49.37522008143603%2C16.600341796875%2C49.38237278700955%26WIDTH%3D256%26HEIGHT%3D256%26STYLES%3D

Voici l'image obtenue (version semi-transparente) :

recolor_png2.png
(source : <a href="http://www.digilog.de/pub/stackoverflow/recolor_png2.png" rel="nofollow noreferrer">digilog.de </a>)

Le même wrapper sans sortie semi-transparente (imagesavealpha supprimées du code) :

http://www.digilog.de/pub/stackoverflow/recolor_png.php?url=http%3A%2F%2Fgeoportal2.uhul.cz%2Fwms_oprl%2F%3FSERVICE%3DWMS%26REQUEST%3DGetMap%26SERVICE%3DWMS%26VERSION%3D1.1.1%26LAYERS%3DHMLCR%26FORMAT%3Dimage%2Fpng%3B%2520mode%3D24bit%26FGCOLOR%3D0xFF0000%26TRANSPARENT%3DTRUE%26SRS%3DEPSG%3A4326%26BBOX%3D16.58935546875%2C49.37522008143603%2C16.600341796875%2C49.38237278700955%26WIDTH%3D256%26HEIGHT%3D256%26STYLES%3D

Et l'image non transparente qui en résulte :

recolor_png.png
(source : <a href="http://www.digilog.de/pub/stackoverflow/recolor_png.png" rel="nofollow noreferrer">digilog.de </a>)

Je laisserai ces enveloppes en ligne pendant quelques jours pour que vous puissiez les tester.

Mise en cache

Cette conversion étant gourmande en ressources processeur, il peut être judicieux d'ajouter un code de mise en cache au wrapper :

  • créer un code de hachage à partir de l'URL donnée, par exemple : $hash=md5($url)
  • vérifier si une image nommée $hash.png existe dans un sous-dossier de stockage
  • si oui : lire l'image à partir du fichier et la renvoyer
  • sinon : créer une image, la sauvegarder en tant que $hash.png dans un sous-dossier et la renvoyer immédiatement

Si vous pensez que le contenu de votre WMS changera au fil du temps : Vérifiez également la date de création des images mises en cache et purgez-les si elles sont trop anciennes (environ un mois). Ainsi, toute modification apportée aux cartes WMS se répercutera dans votre système après un délai maximum d'un mois.

-1voto

unicoletti Points 154

Le lien WMS comporte déjà des paramètres personnalisés qui vous permettent de faire exactement ce que vous demandez. Le lien est le suivant :

  http://geoportal2.uhul.cz/mapserv/php/mapserv3.php?project=oprl_2011&mode=map&mapsize=256%20256&layers=HMLCR%20&x=1322616184548&map_SMO_class_0_color=0%200%200&map_HMLCR_class_0_color=255%200%200&mapext=-679915.1258015268%20-1062651.2224427482%20-679660.3694656485%20-1062461.062442748

Si vous l'inspectez, vous remarquerez qu'entre tous les paramètres codés en url, il y a un paramètre appelé de manière intéressante : map_HMLCR_class_0_color

Si vous changez sa valeur en vert, par exemple (dont le code RVB est 0,255,0), les calques sont rendus en vert. La couleur est exprimée sous la forme d'un code RVB. Il existe également un autre paramètre map_SMO_class_0_color mais je ne comprends pas ce que cela fait. Peut-être s'agit-il d'une fonctionnalité qui n'est pas visible dans cette demande ?

Exemple pour la couleur verte :

 http://geoportal2.uhul.cz/mapserv/php/mapserv3.php?project=oprl_2011&mode=map&mapsize=256%20256&layers=HMLCR%20&x=1322616184548&map_SMO_class_0_color=0%20100%20200&map_HMLCR_class_0_color=0%20255%200&mapext=-679915.1258015268%20-1062651.2224427482%20-679660.3694656485%20-1062461.062442748

ce qui donne le résultat suivant :

green styled request

Note sur la représentation des couleurs rgb dans Mapserver

le triplet RVB doit être écrit comme suit dans la demande :

R G B

(les blancs sont obligatoires). Dont la représentation codée en URl est :

R%20G%20B

parce que %20 est la façon dont l'espace est encodé dans les URL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X