2017-08-29 3 views
1

J'ai un polygone dans mes villes modèles mais dans ma carte par exemple bogota a les coordonnées -8243997.66798 , 517864.86656 -> ouvrir des cartes routières; mais j'ai besoin de faire une requête avec des coordonnées comme (4.697857, -74.144554) -> Google Maps.geodjango format de requête coordonnées-convertir lat lon, ouvrir la carte

pnt = 'POINT(%d %d)'%(lon, lat) 
zonas = ciudad.zona_set.filter(polygon__contains=pnt) 

zonas est vide: /, comment je peux convertir lat et lon à Standar coordonnées dans le plan de rue, ou comment savoir le srid Code pour une entrée (lat,lon)

pnt = GEOSGeometry('POINT(-96.876369 29.905320)', srid=srid_from_lat_lon) 

grâce

Répondre

0

Lorsque vous effectuez des requêtes spatiales, il est recommandé de transmettre une géométrie dotée d'un système de référence spatiale spécifié (srid). Comme ceci, GeoDjango convertira automatiquement la géométrie de la requête d'entrée au système de coordonnées de votre table (les systèmes de coordonnées de votre modèle de ville dans votre cas).

Dans le premier exemple de code que vous avez donné, vous ne spécifiez pas de srid sur la géométrie, donc pnt = 'POINT(%d %d)'%(lon, lat) n'a pas de srid. Dans ce cas, GeoDjango supposera que le srid est le même pour l'entrée et la table de données du modèle. Ce qui n'est pas le cas dans votre exemple, et c'est pourquoi vous n'obtenez aucune correspondance.

Vous aurez donc besoin de créer votre point avec le bon SRID. Si vous obtenez les coordonnées d'OSM, les coordonnées sont probablement dans le Web Mercator projection, qui a le code 3857. Cette projection est souvent utilisée dans la cartographie Web.

Pour cela, vous pouvez utiliser le EWKT format (which is essentially SRID + WKT) comme ceci:

pnt = 'SRID=4326;POINT(-96.876369 29.90532)' 

Ou si vous avez les coordonnées dans la projection Mercator Web, ce qui suit devrait fonctionner:

pnt = 'SRID=3857;POINT(-8243997.66798 517864.86656)' 
zonas = ciudad.zona_set.filter(polygon__contains=pnt) 

Juste pour référence, ici sont quelques exemples sur la façon de revenir en arrière entre EWKT et GEOSGeometries:

Donc ceci (WKT normal, avec srid spécifié sur la création de la géométrie)

GEOSGeometry('POINT(-8243997.66798 517864.86656)', srid=3857) 

est équivalent à ce (SRID contenue dans la chaîne de EWKT):

GEOSGeometry('SRID=3857;POINT(-8243997.66798 517864.86656)')