GeoDjango:如何从10km x 10km大小的中心点创建边界框
如何创建从大小为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
中找到我的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米。用这个交叉线创建一个盒子,我们应该拥有它
要精确计算给定经度 - 纬度的边界框,您将需要进行测地计算。这可以通过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)
Thx的距离对象'D(km = 30)'来实现共享。你为什么选择clrk66椭球体?我的多头和懒惰是谷歌地图。所以我必须使用WGS84,对吗? –
**一旦你计算sw_lng,sw_lat,ne_lng,ne_lat ** 这是我的问题。如何计算它? –
我可以通过使用'pyproj.Geod.fwd'方法和使用角度0,90,180,270, – mbieren