2017-09-06 120 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)) 

我想用這個外接矩形框,這個外接矩形框

MyObject.objects.filter(point__within=poly 

回答

0

中找到我的MySQL數據庫點一旦你計算sw_lng,sw_lat,ne_lng,ne_lat

試試這個(只用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的橫產卵30000米。用這個交叉線創建一個盒子,我們應該擁有它

+0

**一旦你計算sw_lng,sw_lat,ne_lng,ne_lat ** 這是我的問題。如何計算它? –

+0

我可以通過使用'pyproj.Geod.fwd'方法和使用角度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] 

您可以使用它來創建邊界框的多邊形。

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

Thx的距離對象'D(km = 30)'來實現共享。你爲什麼選擇clrk66橢球體?我的多頭和懶惰是谷歌地圖。所以我必須使用WGS84,對嗎? –