2009-12-21 5 views
3

Je souhaite utiliser GeoDjango pour effectuer des recherches de base. Plus précisément, je veux donner la fonction de recherche un code postal/ville/comté et trouver tous les codes postaux/villes/comtés dans 5MI, 10MI, 20MI, etc. Je trouve le paragraphe suivant dans la documentation:GeoDjango recherche à distance

aide un système de coordonnées géographiques peut introduire des complications pour le développeur plus tard. Par exemple, PostGIS n'a pas la capacité d'effectuer des calculs de distance entre géométries non ponctuelles en utilisant des systèmes de coordonnées géographiques, par exemple en construisant une requête pour trouver tous les points à moins de 5 miles d'une limite de comté stockée sous WGS84. [6]

Qu'est-ce que cela signifie exactement si je veux utiliser PostGIS et être capable de faire les recherches décrites ci-dessus à travers les États-Unis? Les docs suggèrent d'utiliser un système de coordonnées projeté pour couvrir seulement une région spécifique. Je dois couvrir tout le pays, donc je suppose que ce n'est pas une option. Fondamentalement, à la fin, je veux être en mesure de trouver les codes postaux voisins/villes/comtés donné un emplacement de départ et la distance. Je me fiche de savoir comment cela se fait sur le plan technique.

Où puis-je trouver une base de données contenant les limites géographiques des codes postaux/villes/comtés aux États-Unis que je peux importer dans un modèle GeoDjango?

MISE À JOUR

Je trouve une base de données contenant les coordonnées de latitude et de longitude de tous les codes postaux aux Etats-Unis here. Mon plan est d'importer ces points dans un modèle GeoDjango et d'utiliser PostGis pour construire des requêtes qui peuvent trouver d'autres points à x milles d'un point donné. Cela contourne le problème soulevé dans la documentation car tous les codes postaux sont traités comme des points au lieu de polygones. C'est très bien pour mon cas d'utilisation parce que la précision parfaite n'est pas quelque chose qui m'intéresse.

Le bon: le fichier de données est libre

La mauvaise: ces données proviennent du recensement il est donc tout à fait 2000 daté

Le peu d'espoir: le Bureau du recensement des États-Unis procèdent à un recensement tous les 10 ans et il est presque 2010

la conclusion: il est assez bon pour moi

+0

Si vous avez déjà trouvé ce problème, il serait vraiment utile de voir un petit extrait de votre code. De toute façon, merci pour le poste –

+0

@NickB voir ma réponse. – hekevintran

Répondre

3

pour contourner la limitation dans le devis, il vous suffit de prendre le barycentre de la région de code postal fourni par l'utilisateur, puis de ce point trouver toutes les régions de codes postaux qui croisent un cercle de 5, 10 ou quelque soit le mile qui émane de ce point. Je ne sais pas comment cela pourrait être réalisé avec geodjango, mais avec postgis c'est certainement possible. La limitation que vous avez citée dit essentiellement que vous ne pouvez pas écrire une requête qui dit "donnez-moi tous les points qui sont à moins de 5 miles à l'intérieur de la frontière de l'Ohio."

0
In [1]: o = Place.objects.get(pk=2463583) # Oakland, CA 

In [2]: sf = Place.objects.get(pk=2487956) # San Francisco, CA 

In [3]: o.coords.transform(3410) # use the NSIDC EASE-Grid Global projection 

In [4]: sf.coords.transform(3410) # use the NSIDC EASE-Grid Global projection 

In [5]: o.coords.distance(sf.coords) # find the distance between Oakland and San Francisco (in meters) 
Out[5]: 14401.942808571299