【问题标题】:Using Shapely to create polygons from four latitude and longitude corners使用 Shapely 从四个经纬度角创建多边形
【发布时间】:2021-06-14 02:19:25
【问题描述】:

我正在尝试使用来自臭氧监测仪器 (OMI) 的数据文件,并将来自该来源的数据与监测类似数据的地表仪器进行比较。

最后,我想知道是否在特定的多边形内。不过,要做到这一点,我需要创建我想象的多边形。

我有以下变量

latmat

latmat[1] = array([-62.2546, -62.371 , -62.4871, -62.6032], dtype=float32)
latmat[2] = array([-62.7195, -62.8356, -62.9519, -63.0676], dtype=float32)

lonmat

lonmat[1] = array([135.579, 135.606, 135.633, 135.66 ], dtype=float32)
lonmat[2] = array([135.688, 135.717, 135.745, 135.774], dtype=float32)

latmat 和 lonmat 当然都比两个索引大得多,但我试图保持这些简单。这些值分别代表一个四角卫星像素的经纬度点。

除此之外,我还有表单中的数据

data[1] = 1E+15
data[2] = 3E+15

如何使用 geopandas 创建一个地理数据框,将 4 个纬度/经度点的每个组合识别为一个多边形?

【问题讨论】:

  • 我的回答解决了你的问题吗?如果是,请标记为已接受的答案并投票。如果没有,请告诉我您需要什么,我会帮助您。谢谢!

标签: python pandas geopandas shapely


【解决方案1】:

您需要为此使用zip()

from shapely.geometry import Polygon    
import numpy as np

latmat1 = np.array([-62.2546, -62.371 , -62.4871, -62.6032], dtype=np.float32)
latmat2 = np.array([-62.7195, -62.8356, -62.9519, -63.0676], dtype=np.float32)
lonmat1 = np.array([135.579, 135.606, 135.633, 135.66 ], dtype=np.float32)
lonmat2 = np.array([135.688, 135.717, 135.745, 135.774], dtype=np.float32)

pol1 = Polygon([(i,j) for i,j in zip(lonmat1, latmat1 ) ])
pol2 = Polygon([(i,j) for i,j in zip(lonmat2, latmat2 ) ])

【讨论】:

  • 嗨迷路人,非常感谢您的帮助。可悲的是,当我尝试将其应用于 latmat(大小为 98580x4 并包含 latmat1、latmat2 以及 4 纬度角输出的更多迭代)和 lonmat 时,我收到错误“ValueError:具有更多一个元素不明确。使用 a.any() 或 a.all()"
【解决方案2】:

我认为您的数据的存储方式对我有用。

from shapely.geometry import Polygon    
import numpy as np

lonmat= [np.array([135.579, 135.606, 135.633, 135.66 ]), np.array([135.688, 135.717, 135.745, 135.774])]
latmat = [np.array([-62.2546, -62.371 , -62.4871, -62.6032]), np.array([-62.7195, -62.8356, -62.9519, -63.0676])]


geom_list = [(x, y) for x, y  in zip(lonmat, latmat)]

geom_list_2 = [Polygon(tuple(zip(x, y))) for x, y in geom_list]

【讨论】:

    【解决方案3】:

    所以,我最终意识到我可以使用以下代码将数组重塑为正确的多边形。

    temp = pd.concat([pd.Series(np.ravel(latcorners)), pd.Series(np.ravel(loncorners))],axis = 1)
    temp['id'] = pd.Series(np.repeat([x for x in range(int(len(temp)/4))], 4))
    temp['coord'] = list(zip(temp[1], temp[0]))
    temp.columns = ['lat','lon','id','coord']
    temp_out = temp.groupby('id').apply(lambda x: Polygon(x['coord'].to_list()))
    

    此代码将“ID”分配给我的数组中的每个变量,这些变量对应于我希望该值成为其中一部分的特定多边形。然后我使用最后一行代码按 ID 分组,并将每组坐标转换为一个多边形。

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2013-03-17
      • 2014-09-10
      • 1970-01-01
      相关资源
      最近更新 更多