如何使用python生成常规地理网格?

如何使用python生成常规地理网格?,python,google-maps,geopy,Python,Google Maps,Geopy,我想检索特定地图区域上规则栅格的所有lat/lon坐标对。我找到了geopy库,但根本没有设法解决这个问题 例如,我有一个矩形地理区域,由其四个角在lat/lon坐标中描述,我试图计算网格,间距为1km,覆盖该区域。初步考虑 它对你的特定区域的定义有一点不同。如果它只是一个矩形区域(注意:投影中的矩形在地球表面上不一定是矩形!),您可以使用所需的步长在两个坐标维度上从最小值迭代到最大值。如果手头有任意多边形形状,则需要测试生成的点中的哪些点与该多边形相交,并仅返回该条件成立的坐标对 计算规则网格

我想检索特定地图区域上规则栅格的所有lat/lon坐标对。我找到了geopy库,但根本没有设法解决这个问题

例如,我有一个矩形地理区域,由其四个角在lat/lon坐标中描述,我试图计算网格,间距为1km,覆盖该区域。

初步考虑 它对你的特定区域的定义有一点不同。如果它只是一个矩形区域(注意:投影中的矩形在地球表面上不一定是矩形!),您可以使用所需的步长在两个坐标维度上从最小值迭代到最大值。如果手头有任意多边形形状,则需要测试生成的点中的哪些点与该多边形相交,并仅返回该条件成立的坐标对

计算规则网格 规则栅格不等于跨越投影的规则栅格。你说的是纬度/经度对,这是一个极坐标系,以度为单位,近似地球表面形状。在lat/lon(EPSG:4326)中,距离不是以米/公里/英里为单位,而是以度为单位

此外,我假设您要计算一个网格,其“水平”台阶平行于赤道(即纬度)。对于其他网格(例如旋转矩形网格、垂直与经度平行等),您需要花费更多的精力来变换形状

问问自己:您想创建一个以度或米为单位的规则间隔栅格吗

以度为单位的网格

如果希望以度为单位,只需迭代:

stepsize = 0.001
for x in range(lonmin, lonmax, stepsize):
    for y in range(latmin, latmax, stepsize):
        yield (x, y)
但是:一定要知道,以米为单位的步长在整个地球表面上是不同的。例如,靠近赤道的0.001δ纬度在地表上覆盖的距离(以米为单位)与靠近两极的距离(以米为单位)不同

以米为单位的网格

如果您希望以米为单位,则需要将输入区域(地图上的特定区域)的纬度/经度边界投影到支持以米为单位的距离的坐标系中。可以使用作为粗略近似值来计算lat/lon对之间的距离,但这不是可以使用的最佳方法

更好的方法是搜索合适的投影,将感兴趣的区域转换为该投影,通过直接迭代创建网格,获取点,并将它们投影回lat/lon对。例如,适用于欧洲的预测是EPSG:3035。顺便说一句,谷歌地图使用EPSG:900913作为他们的网络地图服务

在python中,可以使用库
shapely
pyproj
处理地理形状和投影:

import shapely.geometry
import pyproj

# Set up transformers, EPSG:3857 is metric, same as EPSG:900913
to_proxy_transformer = pyproj.Transformer.from_crs('epsg:4326', 'epsg:3857')
to_original_transformer = pyproj.Transformer.from_crs('epsg:4326', 'epsg:3857')

# Create corners of rectangle to be transformed to a grid
sw = shapely.geometry.Point((-5.0, 40.0))
ne = shapely.geometry.Point((-4.0, 41.0))

stepsize = 5000 # 5 km grid step size

# Project corners to target projection
transformed_sw = to_proxy_transformer.transform(sw.x, sw.y) # Transform NW point to 3857
transformed_ne = to_proxy_transformer.transform(ne.x, ne.y) # .. same for SE

# Iterate over 2D area
gridpoints = []
x = transformed_sw[0]
while x < transformed_ne[0]:
    y = transformed_sw[1]
    while y < transformed_ne[1]:
        p = shapely.geometry.Point(to_original_transformer.transform(x, y))
        gridpoints.append(p)
        y += stepsize
    x += stepsize

with open('testout.csv', 'wb') as of:
    of.write('lon;lat\n')
    for p in gridpoints:
        of.write('{:f};{:f}\n'.format(p.x, p.y))
导入shapely.geometry
进口pyproj
#设置变压器,EPSG:3857为公制,与EPSG:900913相同
to_proxy_transformer=pyproj.transformer.from_crs('epsg:4326','epsg:3857'))
to_original_transformer=pyproj.transformer.from_crs('epsg:4326','epsg:3857'))
#创建要转换为栅格的矩形角点
sw=形状几何点(-5.0,40.0))
ne=形状几何点(-4.0,41.0))
步长=5000#5 km网格步长
#将角点投影到目标投影
转换的_sw=到_proxy _transformer.transform(sw.x,sw.y)#将NW点转换到3857
已转换的_ne=到_代理_transformer.transform(ne.x,ne.y)#。。同样适用于SE
#迭代二维区域
网格点=[]
x=转换的_sw[0]
当x<0时:
y=转换的_sw[1]
当y<1时:
p=形状。几何体。点(到原始变压器。变换(x,y))
gridpoints.append(p)
y+=步长
x+=步长
自以下日期起打开('testout.csv','wb'):
of.write('lon;lat\n')
对于网格点中的p:
of.write('{:f};{:f}\n'.格式(p.x,p.y))
此示例生成此等距栅格:


像NSEW这样的基点?基点如何以(lon,lat)-对的形式给出,它们如何有距离?请详细说明您的问题并添加到目前为止的代码。对不起,我错了,我想查找某个区域的所有坐标,例如,我在谷歌地图中有一个区域的4个坐标,我想检索该区域的所有坐标,彼此之间的距离为10公里。我现在还没有代码,我还在搜索地质学中的一些东西。所以你想为给定的多边形创建点坐标的规则网格吗?是的,就是这个!在geopy或其他图书馆里有什么吗?非常感谢,你已经非常清楚了,你教了我很多新东西,谢谢!您的代码中有一个小错误:当写入testout.csv时,流被定义为“wb”,但会写入一个字符串。应该改为“w”。对,这里可以改为
w
;然而,由于这是Python2.7i,就个人而言,在编写字符串以正确编写Unicode时,通常使用
wb
nw
不是左上角,而是左下角,因此
sw
。东北角(右上角)的
se
应命名为
ne
。@Badmiral我将生成的CSV加载到QGIS中并截图,这是我最快的解决方案。您还可以轻松使用
matplotlib