功能:对设定的区域进行网格划分,给定一个位置,计算其网格ID
输入:区域边界,网格大小,经纬度坐标
输出:网格ID
from geopy.distance import geodesic
import math
bounds=[120,25,130,35] #区域范围(最小经度,最小纬度,最大经度,最大纬度)
size=18 #网格尺寸,这里设定为18km(实际地理距离)
##### 函数:写一个自动化的函数,计算区域能划分出的行数、列数等信息 #####
def autoGenerateRowColNum(lat1,lat2,lon1,lon2):
latDist=geodesic((lat1,1),(lat2,1)).km #纬度上横跨多少公里
lonDist=geodesic((1,lon1),(1,lon2)).km #经度上横跨多少公里
rowNum=math.ceil(latDist/size)
colNum=math.ceil(lonDist/size)
sumNum=rowNum*colNum
rowWidth=(lat2-lat1)/rowNum
colWidth=(lon2-lon1)/colNum
return rowNum,colNum,sumNum,rowWidth,colWidth
#### 调用上边的函数,对我们设定的区域生成网格属性 ####
rowNum,colNum,sumNum,rowWidth,colWidth=autoGenerateRowColNum(bounds[1],bounds[-1],bounds[0],bounds[-2])
### 函数:利用上边计算好的网格属性,任意给定经纬度,计算其网格id ###
def generateID(lat,lon):
commmon=int((lon-bounds[0])/colWidth)+1+int((lat-bounds[1])/rowWidth)*colNum #正常的就是这么计算
#如果这个点出现在了右边界或者上边界,我们需用强行调整他们的网格ID,不要跑出边界
if lat==bounds[-1]:
commmon-=colNum
if lon==bounds[-2]:
commmon-=1
return commmon
## 调用函数,生成给定位置的网格ID
id = generateID(30.2519, 122.29861)
print(id)