【问题标题】:Geopandas sjoin seems to be returning union rather than intersectionGeopandas sjoin 似乎正在返回联合而不是交集
【发布时间】: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


【解决方案1】:

.overlay() 就是答案。谢谢,保罗 H。

within_pls = gpd.overlay(nrel_w_exclusions,
                       lower48_borders.loc[lower48_borders['STUSPS'] == us_state,['geometry']],
                       how='intersection')
fig = plt.figure()
ax = lower48_borders.loc[lower48_borders['STUSPS'] == 'NE'].plot(color='whitesmoke',edgecolor='black')
within_pls.plot(ax=ax,alpha=.3,color='green')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多