2010-08-23 6 views
6

C'est la première fois que j'utilise GeoDjango avec postGIS. Après l'installation et quelques tests avec tout fonctionne bien, je suis préoccupé par les performances de la requête lorsque les lignes de table vont grandir. J'épargne des longitudes et des latitudes de point de géométrie que je reçois du géocodage de Google (WGS84, ou SRID 4326). Mon problème est que les opérations à distance sont très courantes dans mon application. J'ai souvent besoin de me rapprocher d'un point de repère. Les maths de géométrie sont très complexes, donc même si j'ai un index spatial, il faudra probablement trop longtemps dans le futur pour avoir plus de 1000 points dans une zone proche.Besoin de performances sur postGIS avec GeoDjango

Est-il possible de projeter ce type de géométrie pour accélérer les opérations à distance? Est-ce que quelqu'un connaît une bibliothèque Django capable de rendre une carte Google contenant certains de ces points?

Des conseils sur la façon d'accélérer les requêtes spatiales sur GeoDjango?

+1

Juste pour clarifier, avez-vous des problèmes de performance avec PostGIS? Si vous êtes seulement inquiet de ce qui pourrait arriver, résistez à une optimisation prématurée! Les gens ont de bons résultats avec des requêtes comme la vôtre en utilisant des tables avec plusieurs millions d'enregistrements. Plus d'informations sur les requêtes à distance: http://www.bostongis.com/?content_name = postgis_tut02 # 21 – tcarobruce

+0

Eh bien, je ne suis pas sûr que j'appellerais cette optimisation prématurée (bien que je n'ai pas encore eu de problèmes de performance). Je dois simplement savoir que GeoDjango sera à la hauteur du défi si nécessaire. Je connais postGIS et comment améliorer les requêtes de distance en utilisant && et chevaucher des boîtes, mais par exemple GeoDjango l'utilise-t-il? Par contre, je ne suis pas très pointilleux avec précision, donc je ne devrais pas utiliser la géométrie, parce que ça a un prix. – maraujop

Répondre

0

Généralement, GeoDjango créera et utilisera des index spatiaux sur des colonnes géométriques le cas échéant.

Pour une application traitant principalement des distances entre les points, le Geography type (introduit dans PostGIS 1.5, et supporté par GeoDjango) peut convenir. GeoDjango dit qu'il donne "une bien meilleure performance sur les requêtes de distance WGS84" [link].

+1

Cela est vrai, comme vous pouvez le lire dans http://docs.djangoproject.com/fr/1.2/ref/contrib/gis/model-api/#spatial-index GeometryField.spatial_index -> Valeurs par défaut à True. Crée un index spatial pour le champ de géométrie donné. Django prend en charge le type de géographie depuis la dernière version stable 1.2.1 donc c'est assez nouveau. Dans la documentation, vous pouvez également lire: Parce que les calculs de géographie impliquent plus de mathématiques: http://docs.djangoproject.com/en/dev/ref/contrib/gis/model-api/#selecting-an-srid Alors ce que je demande est la géographie vraiment un bon ajustement? va-t-il évoluer correctement? – maraujop

3

Si vous pouvez adapter votre zone de travail dans une projection cartographique, cela sera toujours plus rapide, car il y a moins d'appels mathématiques nécessaires pour des choses comme les calculs de distance. Cependant, si vous avez vraiment des données globales, aspirez-le: utilisez la géographie. Si vous n'avez que des données continentales des États-Unis, utilisez quelque chose comme EPSG: 2163 http://spatialreference.org/ref/epsg/2163/

Plus votre espace de travail est restreint, plus vous pouvez obtenir des résultats précis dans une projection cartographique. Voir les projections du plan d'état pour des projections précises et hautement contraintes pour les régions régionales des États-Unis. Ou des projections UTM pour les grandes régions infranationales.

+0

Je comprends que la projection est plus rapide, mais je gère des géodonnées espagnoles et je ne sais pas comment les transformer, les stocker et les traiter dans GeoDjango. Dans le même temps, pas sûr si les points donnés par Google sont dans SRID 4326 ou EPSG 900913 – maraujop

+1

L'API Google retourne et consomme des coordonnées dans EPSG: 4326. Pour un système projeté en Espagne, essayez EPSG: 25831. –

2

Je fais des recherches sur ce sujet. Pour autant que j'ai trouvé, les coordonnées que vous obtenez de la bibliothèque geopy sont au format SRID 4326, donc vous pouvez les stocker dans un type de champ de géométrie sans problèmes. Ce serait un exemple d'un modèle GeoDjango utilisant la géométrie:

class Landmark(models.Model): 
    point = models.PointField(spatial_index = True, 
          srid = 4326, 
          geography = True) 

    objects = models.GeoManager() 

Par ailleurs, être très prudent de passer la longitude/latitude au PointField, dans cet ordre exact. geopy renvoie les coordonnées de latitude/longitude, vous devrez donc les inverser.

Pour transformer des points d'un système de coordonnées en un autre, nous pouvons utiliser GEOS avec GeoDjango. Dans l'exemple que je vais transformer un point en 4326 à la célèbre projection Google 900913:

from django.contrib.gis.geos import Point 
punto = Point(40,-3) 
punto.set_srid(900913) 
punto.transform(4326) 
punto.wkt 
Out[5]: 'POINT (0.0003593261136478 -0.0000269494585230)' 

De cette façon, nous pouvons stocker les coordonnées dans les systèmes de projection, qui auront de meilleures mathématiques de performance. Pour afficher des points dans une carte Google dans l'interface du site d'administration. Nous pouvons utiliser this great article.

J'ai décidé de continuer avec les types de géographie, et je les convertirai dans le futur, au cas où je devrais améliorer les performances.

Questions connexes