2017-09-06 5 views
0

Comment créer un boundingbox à partir d'un point central d'une taille de 10km x 10km?GeoDjango: Comment créer un boundingbox à partir d'un point central avec une taille de 10km x 10km

En ce moment, je le fais comme ci-dessous. Mais ce n'est pas une solution bonne et précise.

lng30km = 0.42 # I measured this values with google maps 
lat30km = 0.27 # It is not accurate and won't work properly 
minx = point.x - lng30km 
miny = point.y - lat30km 
maxx = point.x + lng30km 
maxy = point.y + lat30km 
poly = Polygon.from_bbox((minx, miny, maxx, maxy)) 

Je veux utiliser ce BoundingBox, pour trouver des points dans mon DB MySQL dans ce BoîteDeContour

MyObject.objects.filter(point__within=poly 

Répondre

0

Une fois que vous avez calculé sw_lng, sw_lat, ne_lng, ne_lat

Essayez ceci (seulement testé avec postgres) Je ne suis pas si sûr de MySql. Vous devriez utiliser PostGIS de toute façon. MySql a beaucoup de limitations.

xmin = float(sw_lng) 
    ymin = float(sw_lat) 
    xmax = float(ne_lng) 
    ymax = float(ne_lat) 
    bbox = (xmin, ymin, xmax, ymax) 
    geom = Polygon.from_bbox(bbox) 

    values = use_class.objects.filter(active=True, source__coveredby=geom) 

Par exemple (pseudo-code non testé):

geod = pyproj.Geod(ellps='WGS84') 

dis = 30000/2 

top_x, top_y, top_azi = geod.fwd(center_longitude, center_latitude, 0, dis) 
right_x, right_y, right_azi = geod.fwd(center_longitude, center_latitude, 90, dis) 
bottom_x, bottom_y, bottom_azi = geod.fwd(center_longitude, center_latitude, 180, dis) 
left_x, left_y, left_azi = geod.fwd(center_longitude, center_latitude, 270, dis) 

On construit ainsi un reproducteur transversale 30.000 mètres par déplacement du centre 0, 90, 180, 270 par la distance. Construire une boîte avec ces coordonnées et nous devrions l'avoir

+0

** Une fois que vous avez calculé sw_lng, sw_lat, ne_lng, ne_lat ** C'est ma question. Comment le calculer? –

+0

Je pourrais être accompli en utilisant la méthode 'pyproj.Geod.fwd' et l'objet distance' D (km = 30) 'en utilisant les angles 0, 90, 180, 270 – mbieren

0

Pour calculer avec précision le cadre de délimitation pour une latitude-longitude donnée, vous devrez faire un calcul géodésique. Cela peut être réalisé avec la bibliothèque pyproj. Les documents détaillés pour pyproj sont here.

Installez la bibliothèque via pip dans votre terminal.

pip install pyproj 

Compte tenu de votre latitude et la longitude, la zone de délimitation sont les coins au nord-est, sud-est, sud-ouest et nord-ouest. Chacun d'entre eux a une valeur d'azimut correspondante en degrés: 45, 135, 225 et 315, respectivement. Maintenant, en utilisant la valeur pyproj, vous pouvez faire quelque chose comme ceci:

from pyproj import Geod 

g = Geod('clrk66') # Create a geodesic calculation object 
distance = 10 * 1000 # in meters 

# given latitude (lat), longitude (lon) values for the location 
top_right_corner = g.fwd(lon, lat, 45, distance) 
bottom_right_corner = g.fwd(lon, lat, 135, distance) 
bottom_left_corner = g.fwd(lon, lat, 225, distance) 
top_left_corner = g.fwd(lon, lat, 315, distance) 

Les limites de la boîte peuvent être obtenus à partir de ces coins.

max_lon = top_right_corner[0] 
max_lat = bottom_right_corner[1] 
min_lon = bottom_left_corner[0] 
min_lat = top_left_corner[1] 

Vous pouvez utiliser ceci pour ensuite créer le polygone pour la zone de délimitation.

bbox = (max_lon, max_lat, min_lon, min_lat) 
geom = Polygon.from_bbox(bbox) 
+0

Thx pour le partage. Pourquoi avez-vous choisi clrk66 ellipsoïde? Mes longs et les lats sont de google maps. Donc je dois utiliser WGS84, correct? –