Suite

Exporter par programmation des cartes Openlayers vers un fichier image statique


Pour autant que je comprends cet exemple de la page OpenLayers et le code source lié pour cet exemple, OpenLayers3 a maintenant la capacité officielle d'enregistrer des cartes en tant que fichiers image statiques.

Cependant, la sauvegarde se fait via un bouton sur le site (et je ne comprends pas bien comment car je ne suis pas trop en Javascript).

Existe-t-il également une possibilité de le faire par programmation de la manière suivante ?

  1. Créez par programmation une page Web avec une carte OpenLayers3 intégrée, affichant les données de toutes les sources
  2. Exportez le canevas de la page Web (tous les calques qui seraient affichés lors de l'ouverture de la page dans un navigateur) dans un fichier image statique

Je pense que la création de la page Web ne serait pas si difficile. Cependant, la question est plus de savoir s'il est possible d'utiliser leexportationsans bouton cliquable mais en l'appelant via un script, une ligne de commande ou similaire.

J'ai fait quelques tests avec cette approche en utilisant PhantomJS pour enregistrer une capture d'écran de la page Web. Cependant, je n'ai pas encore réussi à le faire fonctionner correctement (objet de carte de ma page Web introuvable, lorsqu'il est trouvé, le rendu est lancé avant que toutes les tuiles n'aient été chargées, les paramètres de taille sont ignorés.


Suppression de la dépendance OpenLayers3 du titre, les solutions utilisant OpenLayers2 sont également les bienvenues.


Utilisez-vous GeoServer comme backend ?
Vous pourriez construire un ObtenirCarte demander via JavaScript et utiliser un OBTENIR HTML demande pour obtenir cette image.
J'utilise cette même approche pour intégrer par programme des cartes statiques dans des rapports dans Ms-Access.
ÉDITER:
J'utilise PostgreSQL pour stocker mes données et GeoServer gère le rendu et la diffusion de ces données.
Pour intégrer des cartes statiques dans les rapports Ms-Access, j'obtiens d'abord la BoundingBox de la zone dont je voudrais une carte. Cela se fait purement en SQL via une fonction personnalisée pour interroger ma base de données PostgreSQL.
Vous pourriez obtenir les mêmes réponses en utilisant ol.étendue et ses méthodes (par ex. ol.extent.getBottomLeft()) pour obtenir votre BoundingBox.
Voici mon code VBA construisant la demande.

GetMapString = "http://" + GeoServerHost + "/geoserver/wms?request=GetMap&service=WMS&version=1.1.3" & _ "&layers=" + GeoServerWorkspace + ":" + LayerName & _ "&styles=" & _ " &srs=EPSG:27700" & _ "&bbox=" & x1 & "," & y1 & "," & x2 & "," & y2 & _ "&width=1200&height=1200" & _ "&format_options=dpi:300; anticrénelage:on" & _ "&format=image%2Fpng8"

Construire un GetMapString équivalent en JavaScript, puis l'envoyer avec la requête HTML GET, devrait renvoyer une image PNG8.
Assurez-vous de vérifier et de modifier le paramètre SRS car vous ne voudriez probablement pas que votre image soit projetée dans British National Grid.


L'approche suivante fonctionne pour moi pour enregistrer des cartes statiques dans des fichiers png à partir d'une page Web avec une carte OpenLayers2 intégrée (je ne vois cependant aucune raison pour laquelle cela ne devrait pas fonctionner avec OpenLayers3).

Le code suivant est basé sur l'exemple donné sur http://acuriousanimal.com/blog/tag/phantomjs/. Je l'ai légèrement modifié pour intégrer le code donné par l'utilisateur cjoudrey sur GitHut/Gist. C'était la meilleure approche de travail que j'ai trouvée pour faire en sorte que phantomJS attende que la page complète se charge (y compris toutes les géodonnées et les tuiles de carte) avant d'enregistrer la carte dans un fichier image - sinon, on obtiendrait souvent une image avec les géodonnées tracées sans le tuiles de fond de carte. D'ailleurs, j'ai préféré coder en dur les paramètres nécessaires au lieu de les passer depuis la ligne de commande.

  1. Installez phantomJS sur votre système comme décrit sur la page officielle. phantomJS est un kit de navigateur sans tête qui vous permet d'accéder aux pages Web à partir de la ligne de commande sans aucune interface graphique, contrôlant la navigation des pages Web avec un fichier JavaScript. De plus, il dispose d'une fonction de rendu qui vous permet d'enregistrer des captures d'écran de pages Web complètes ou uniquement d'éléments HTML spécifiques.

  2. Créez le fichier JavaScript suivant (en le nommant par ex.download.js) et assurez-vous de modifier les trois premières lignes en fonction de la page Web que vous souhaitez interroger.ID de cartese réfère à lasection de votre page Web qui intègre la carte OpenLayers, respectivement à l'ID utilisé dans le constructeur de la carte, par ex.var map = new OpenLayers.Map("mymapid");.

download.js :

// modifiez ces paramètres en conséquence ! var url = 'http://localhost:8000/OL.html'; var mapID = 'mymapid'; var outputFilename = 'map.png">comme décrit sur la page d'accueil. Démarrez un shell de commande, accédez au dossier où vos fichiers sont stockés et tapezpython -m http.serveur(Python 3.x) oupython -m SimpleHTTPServer(Python 2.x). Ensuite, vous pouvez accéder à votre dossier viahttp://localhost:8000/OL_testpage.html

Inconvénients de cette approche : À ma connaissance actuelle, cette approche présente deux inconvénients. 1. L'image n'est rendue à la bonne taille que si la carte a été créée avec une largeur et une hauteur données en pixels absolus (comme dans mon exemple ci-dessus, les ligneslargeur : 1600px ;ethauteur : 1200px ;). Si la largeur et la hauteur sont données en pourcentage des fenêtres du navigateur comme le font de nombreuses personnes (par ex.largeur : 100 % ;) alors l'image résultante est assez petite et a un format quadratique. 2. L'utilisation de phantomJS a bien fonctionné pour moi lorsque je l'ai appliqué à des cartes avec assez peu de fonctionnalités. Je suis toujours en train d'expérimenter pour exécuter cela sur des cartes qui chargent un grand nombre d'entités dans une couche vectorielle (par exemple, un réseau routier avec 900 000 lignes). Cela fait planter phantomJS à chaque fois.


Exporter par programmation des cartes Openlayers vers un fichier image statique - Systèmes d'information géographique

Je suis le seul type SIG (commencé la semaine dernière, le syndrome de l'imposteur est réel. J'ai appris sur ArcGIS mais j'utilise ArcPro/AGOL) et je souhaite mettre des cartes à la disposition de mes collègues afin qu'ils puissent afficher les tables attributaires et autres, plutôt que de leur donner des informations statiques PDF. J'ai ArcPro et AGOL. Je sais quel niveau, mais je peux y créer des cartes, mais je ne peux pas publier de couches Web à partir d'ArcPro, si cela vous donne un indice.

J'ai créé un groupe dans AGOL et je voulais que mes collègues créent des comptes AGOL juste pour rejoindre le groupe et voir les cartes sans avoir besoin de créer des trucs. Je sais quelles données sont publiques ou non, alors je voulais les cacher derrière un groupe et laisser les gens que je connais y entrer. Cependant, il semble qu'ils aient besoin d'une version payante d'AGOL juste pour rejoindre mon groupe et la voir ? Les laisser voir des trucs dans mon groupe AGOL semble être l'option la plus propre, mais leur obtenir chacun un compte ou un compte partagé s'il y a un coût peut être un casse-tête.

Si je sais que les données sont publiques, puis-je créer une carte sur AGOL accessible aux personnes sans compte payant/sans connexion, ou la possibilité de visualiser tout le contenu AGOL est-elle payante nécessitant un compte payant quelconque ?

Existe-t-il de bonnes alternatives à AGOL comme Google Earth/Maps ?

1) Puis-je permettre à des collègues de voir les cartes de mon groupe AGOL avec n'importe quel type de compte AGOL gratuit (pas d'essai) ?

2) Puis-je rendre les cartes AGOL avec des données non sensibles visibles par tout le monde, même sans compte AGOL ?

3) Des alternatives à AGOL, et ont-elles la possibilité pour moi de contrôler qui peut accéder aux cartes là-bas si j'ai besoin d'utiliser des données qui ne sont pas publiques ?


Voir la vidéo: 13. GoTalk NOW: Exporter une programmation en format PDF (Octobre 2021).