14 votes

Rendu des données spatiales de GeoQuerySet dans une vue personnalisée sur GeoDjango

Je viens de commencer mon premier projet sur GeoDjango.

En fait, avec l'application Admin alimentée par GeoDjango, nous avons tous la possibilité d'afficher/éditer les données spatiales associées à l'objet actuel.

Le problème est qu'après que les objets aient été remplis Je dois rendre la géométrie associée de plusieurs objets en une seule fois sur une seule carte. . Je pourrais l'implémenter comme une action de modèle, redirigeant vers une vue personnalisée. Mais je ne sais pas comment inclure le widget OpenLayers dans la vue et comment y rendre ma géométrie composée à partir de mon GeoQuerySet.

Je serais très reconnaissant à un programmeur GeoDjango expérimenté de me donner des conseils.

28voto

Christopher Schmidt Points 412

Deux moitiés de cette question :

  • Comment générer des données géographiques qu'OpenLayers peut lire via Django ?
  • Comment puis-je consommer ces données avec OpenLayers ?

Génération de données géographiques

Il existe plusieurs façons différentes de générer des données géographiques dans Django. Vous pouvez utiliser les méthodes .kml() ou .json() sur un ensemble de requêtes ; ainsi, chaque instance renvoyée possède une propriété .json ou .kml qui contient le KML ou le JSON de la géométrie générée sous forme de chaîne.

Vous pouvez ensuite utiliser cette sortie dans les modèles qui utilisent {{feature.kml}} ou {{feature.json}} (ce dernier cas est quelque peu difficile, car vous devriez effectuer manuellement l'encodage JSON avant qu'il n'atteigne le modèle, une situation un peu étrange).

Une autre option consiste à utiliser une bibliothèque pour vous aider : plus précisément, vectorformats. (Google "featureserver vectorformats" pour obtenir des informations, car je ne peux inclure qu'un seul hyperlien). Installé via PyPI/easy_install vectorformats, vous pouvez utiliser le format Django :

>>> from vectorformats.Formats import Django, GeoJSON
>>> qs = Model.objects.filter(city="Cambridge")
>>> djf = Django.Django(geodjango="geometry", properties=['city', 'state'])
>>> geoj = GeoJSON.GeoJSON()
>>> s = geoj.encode(djf.decode(qs))
>>> print s 

Cette chaîne peut être renvoyée via une réponse HTTPResponse pour renvoyer un objet GeoJSON. Ainsi, votre vue envelopperait ces 4 lignes dans un bit qui génère un queryset (qs, ici), et renvoie ensuite une HttpResponse avec la chaîne.

Consommation de données

OpenLayers possède des objets "format" qui peuvent lire les données : Il existe des formats pour GeoJSON et KML, ainsi que d'autres.

Vous pouvez charger les données à l'aide des mécanismes standard de XMLHttpRequest puis les analyser avec un format :

var f = new OpenLayers.Format.GeoJSON();
var features = f.read(req.responseText);
layer.addFeatures(features);

Vous pouvez également utiliser la prise en charge intégrée du protocole pour charger des données distantes :

     map = new OpenLayers.Map('map');
     var wms = new OpenLayers.Layer.WMS(
         "OpenLayers WMS", "http://labs.metacarta.com/wms/vmap0",
         {layers: 'basic'}
     );

     var layer = new OpenLayers.Layer.Vector("GML", {
         strategies: [new OpenLayers.Strategy.Fixed()],
         protocol: new OpenLayers.Protocol.HTTP({
            url: "/django/view/json/",
            format: new OpenLayers.Format.GeoJSON()
         })
     });

     map.addLayers([wms, layer]);
     map.zoomToExtent(new OpenLayers.Bounds(
         -3.92, 44.34, 4.87, 49.55
     ));

Vous pouvez voir dans cet exemple que l''url' pointe vers votre vue Django ; tout le chargement des données et leur analyse selon le format fourni est inclus. (Vous pouvez voir un exemple similaire dans la page Exemple d'OpenLayers pour un comportement fixe/protocole http .)

Assemblage

  1. Créez une vue Django, en utilisant vectorformats pour renvoyer vos données au format GeoJSON.
  2. Créez une vue séparée, qui renvoie une page HTML comme l'exemple OpenLayers lié, avec les modifications montrées dans l'exemple de code.
  3. Cette vue sert la page HTML qui charge vos données GeoJSON et les analyse.

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