【发布时间】:2020-05-05 06:55:22
【问题描述】:
我正在尝试通过分配状态来分解大量 NREL 风数据,然后单独处理每个状态。
我有两组这样的 NREL 数据——一组只是一个没有应用排除项的 wind_class,另一组是针对城市地区、不适合的土地、野生动物保护区等应用了排除项的数据。(可在此处获取:https://www.nrel.gov/gis/data-wind.html ,找两个“美国风电类”数据集)
这两个数据集没有任何共同的 ID,因此我可以轻松识别两者之间相同的 1/3 度纬度 x 1/3 度经度单元格(据称这是它们的排列方式)。两个数据集都有标记为“gid”和“id”的变量,但是当我根据任一 ID 绘制相同的切片时,这些变量不会在数据集之间对齐。
所以,我想使用 Geopandas 的 sjoin 函数来识别每个州的 NREL 数据集之间的重叠区域,但这是我的问题:
我通过 sjoin 将每个 NREL 数据集的行连接到美国边界数据集,从而将状态分配给它们。它的默认行为应该是“相交”,看起来它应该只返回位于州边界内的 NREL 数据。 (美国边境数据集可在此处获得:https://catalog.data.gov/dataset/tiger-line-shapefile-2017-nation-u-s-current-state-and-equivalent-national)
在运行第一次 sjoin 后,不带排除项的逐州 NREL 数据集大多遵循州界线 - 分配给给定州的一些单元格正好位于其边界之外,但这很好。
不幸的是,带有排除项的逐州 NREL 数据集有很大的区域不遵守州界线,但 Geopandas 无论如何都分配给特定州。
这里一个特别糟糕的违规者是我的内布拉斯加州数据集,它似乎包括了中西部的大部分地区,尽管该地区的大部分地区都远离内布拉斯加州的边界。中西部的其他州也一样,这让我很生气,因为中西部通常看起来是安装风力涡轮机的好地方,我真的很想使用这些数据。
我尝试使用所有三个可用操作(“相交”,默认值;“包含”;“内部”)重新运行此 sjoin,但它们都没有给我我期望的东西,这只是内布拉斯加州境内的 NREL 数据集。
关于 Geopandas 的 sjoin 功能及其工作原理,我有什么不明白的地方?
这是一个很长的解释,感谢您耐心阅读全文。下面是一些示例代码:
import numpy as np
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
us_state = 'NE'
filename = 'nrel_no_exclusions_{}.geojson'.format(us_state)
print("Reading NREL dataset w/exclusions for {} ".format(us_state),time.strftime('%X %x %Z'))
nrel_w_exclusions = gpd.read_file('{}/nrel_w_exclusions_by_state/nrel_w_exclusions_{}.geojson'.format(disk_dir,us_state),driver='GeoJSON')
within_pls = gpd.sjoin(nrel_w_exclusions,
lower48_borders.loc[lower48_borders['STUSPS'] == us_state,
['STUSPS','geometry']],
how='left',
op='within') # <--also tried "intersects" and "contains" here
fig = plt.figure()
ax = lower48_borders.loc[lower48_borders['STUSPS'] == us_state].plot(color='whitesmoke',edgecolor='black')
within_pls.plot(ax=ax,alpha=.3,color='green')
【问题讨论】:
-
将其归结为手工编码的非常简单的几何图形。几个重叠的正方形会起作用。那你得到预期的结果了吗?
-
谢谢,这是个好建议。 Here's what I found。简而言之 - 一个 sjoin 似乎总是返回一个完整的形状,完整的,而不是交叉点,或者包含或在另一个形状中的形状的一部分。我将 op='intersects' 与完全独立的 .intersection() 方法的行为混淆了。
-
现在,显而易见的后续行动——我能做些什么来获得我真正想要的结果,即两个数据集的交集?我是否需要将 .intersection() 应用于 NREL 数据集的每一行,以获得位于每个州边界内的一组单元格?
-
您能否重写此问题,使其仅包含笔记本中的小示例,并将生成的地理数据框显示为文本?我想知道那里是否有一列对每个几何图形进行分类
-
哦,拍摄。你不想要
sjoin,你想要覆盖:geopandas.org/set_operations.html
标签: geospatial geopandas