GeoDjango:如何从10km×10km大小的中心点创建边界框

时间:2017-09-06 08:59:18

标签: python django point geodjango bounding-box

如何从大小为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))

我想使用这个边界框,在这个边界框中找到我的MySQL数据库中的点

MyObject.objects.filter(point__within=poly

2 个答案:

答案 0 :(得分:0)

一旦你计算了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米的交叉。使用这种交叉线构建一个盒子,我们应该拥有它

答案 1 :(得分: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)