使用 Shapely 从四个经纬度角创建多边形
Using Shapely to create polygons from four latitude and longitude corners
我正在尝试使用来自臭氧监测仪器 (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 个 lat/lon 点的每个组合识别为多边形?
您需要为此使用 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 ) ])
我认为您的数据存储方式对我有用。
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]
所以,我最终意识到我可以使用以下代码将数组重塑为正确的多边形。
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 分组并将每组坐标转换为多边形。
感谢大家的帮助!
我正在尝试使用来自臭氧监测仪器 (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 个 lat/lon 点的每个组合识别为多边形?
您需要为此使用 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 ) ])
我认为您的数据存储方式对我有用。
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]
所以,我最终意识到我可以使用以下代码将数组重塑为正确的多边形。
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 分组并将每组坐标转换为多边形。
感谢大家的帮助!