2017-09-06 138 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,对吗? –