2017-09-06 8 views
0

크기가 10km x 10km 인 중심점에서 시작하여 경계 상자를 만드는 방법은 무엇입니까?GeoDjango : 10km x 10km 크기의 중심점에서 테두리 상자를 만드는 방법

지금 당장은 아래와 같이하고 있습니다. 그러나 이것은 좋은 해결책이 아닙니다.

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)) 

나는 (단지이 시도

ne_lat, 당신은 sw_lng, sw_lat, ne_lng을 계산하면이 BoundingBox의

MyObject.objects.filter(point__within=poly 

답변

0

내에서 내 MySQL의 DB에 포인트를 찾기 위해,이 BoundingBox의를 사용하려면 postgres로 테스트) 나는 MySql에 대해 그렇게 확신하지 못했습니다. 어쨌든 PostGIS를 사용해야합니다. MySql에는 많은 한계가 있습니다.

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) 

는 (의사 코드 테스트하지)

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) 

이 거리 중심 0, 90, 180, 270을 이동시킴으로써 상호 산란 30,000m를 만든다.

+0

은 **이 내 질문이다. 그것을 계산하는 방법? –

+0

공유를 위해 각도 0, 90, 180, 270 – mbieren

0

주어진 경도 - 위도에 대한 경계 상자를 정확하게 계산하려면 측지선 계산을 수행해야합니다. 이것은 pyproj 라이브러리를 사용하여 수행 할 수 있습니다. pyproj에 대한 자세한 문서는 here입니다.

터미널에 pip를 설치하여 라이브러리를 설치하십시오. 위도와 경도 감안할 때

pip install pyproj 

, 경계 상자는 북동, 남동, 남서, 그리고 북서쪽에있는 코너입니다. 이들 각각은도에 대응하는 방위각 값 : 45, 135, 225 및 315를 각각 갖는다. 이제 pyproj 값을 사용하면 다음과 같이 할 수 있습니다.

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) 

상자의 경계는이 모서리에서 얻을 수 있습니다.

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

경계 상자의 폴리곤을 생성 할 때 사용할 수 있습니다. 당신이 ** ne_lat sw_lng, sw_lat, ne_lng을 계산하면

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

Thx를 사용하여'pyproj.Geod.fwd' 메소드와 거리 객체'D (km = 30) '을 사용하면됩니다. 왜 clrk66 타원체를 골랐습니까? 나의 longs와 lats는 Google지도에서 있습니다. 그래서 WGS84를 사용해야합니다, 맞습니까? –