簡體   English   中英

如何使用 python 生成規則的地理網格?

[英]How can I generate a regular geographic grid using python?

我想檢索某個地圖區域上常規網格的所有緯度/經度坐標對。 我找到了 geopy 庫,但根本沒有設法解決這個問題。

例如,我有一個由緯度/經度坐標中的四個角描述的矩形地理區域,我試圖計算覆蓋該區域的間距為例如 1km 的網格。

初步考慮

您的特定區域的定義方式略有不同。 如果它只是一個矩形區域(注意:投影中的矩形不一定是地球表面上的矩形!),您可以簡單地使用所需的步長在兩個坐標維度上從最小值迭代到最大值。 如果您手頭有任意多邊形形狀,則需要測試生成的哪些點與該多邊形相交,並僅返回滿足此條件的那些坐標對。

計算規則網格

規則網格不等於跨投影的規則網格。 你說的是緯度/經度對,它是一個極坐標系,以地球表面形狀的近似度為單位測量。 在緯度/經度 (EPSG:4326) 中,距離不是以米/公里/英里為單位,而是以度為單位。

此外,我假設您想計算一個網格,其“水平”步驟平行於赤道(即緯度)。 對於其他網格(例如旋轉的矩形網格、與經度平行的垂直線等),您需要花費更多的精力來轉換形狀。

問問自己:您想創建一個以度或米為單位的規則間隔網格嗎?

以度為單位的網格

如果你想要度數,你可以簡單地迭代:

stepsize = 0.001
for x in range(lonmin, lonmax, stepsize):
    for y in range(latmin, latmax, stepsize):
        yield (x, y)

但是:一定要知道,以米為單位的步長在地球表面上是不一樣的。 例如,靠近赤道的 0.001 delta 緯度在地表覆蓋的距離(以米為單位)與靠近兩極的距離不同。

以米為單位的網格

如果您想要以米為單位,則需要將輸入區域(地圖上的特定區域)的緯度/經度邊界投影到支持以米為單位的距離的坐標系中。 您可以使用Haversine 公式作為粗略的近似值來計算緯度/經度對之間的距離,但這不是您可以使用的最佳方法。

更好的是搜索合適的投影,將您感興趣的區域轉換為該投影,通過直接迭代創建網格,獲取點,並將它們投影回緯度/經度對。 例如,適合歐洲的預測是 EPSG:3035。 順便說一下,谷歌地圖使用 EPSG:900913 作為他們的網絡地圖服務。

在Python中,你可以使用庫shapelypyproj對地理形狀和預測工作:

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))

此示例生成此均勻間隔的網格:

西班牙的常規電網

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM