Geo pandas sjoin, кажется, возвращает союз, а не пересечение - PullRequest
1 голос
/ 18 января 2020

Я пытаюсь разбить большой набор данных ветра NREL, назначая состояние, а затем работаю с каждым состоянием индивидуально.

У меня есть два набора этих данных NREL-- тот, который является просто wind_class без примененных исключений, и тот, где исключения были применены к городским районам, неподходящим землям, заповедникам дикой природы и т. д. c. (Доступно здесь: https://www.nrel.gov/gis/data-wind.html, найдите два набора данных «Класс энергии ветра США»)

Два набора данных не имеют общих идентификаторов, которые позволили бы мне легко идентифицировать одна и та же широта 1/3 градуса x ячейка долготы 1/3 градуса между ними (именно так они и расположены). Оба набора данных имеют переменные, помеченные как "gid" и "id", но они не выстраиваются между наборами данных, когда я строю одни и те же срезы на основе любого ID.

Итак, я хочу использовать Geo pandas 'функция sjoin для определения перекрывающихся областей между наборами данных NREL для каждого состояния, но вот моя проблема:

Я назначил состояние строкам каждого набора данных NREL, присоединив их к набору данных границ США через sjoin. Предполагается, что его поведение по умолчанию «пересекается», и похоже, что оно должно возвращать только данные NREL, которые находятся в пределах границ состояния. (Набор данных о границах США доступен здесь: https://catalog.data.gov/dataset/tiger-line-shapefile-2017-nation-u-s-current-state-and-equivalent-national)

После запуска этого первого sjoin наборы данных NREL от штата к штату без исключений в основном следуют за линиями состояния - некоторые ячейки, которые были назначены данному состоянию l ie только за пределами его границ, но это нормально.

К сожалению, наборы данных NREL от штата к штату с исключениями имеют большие области, которые не не подчиняется государственным линиям, но Geo pandas назначается определенным штатам в любом случае.

Один особенно плохой нарушитель здесь - мой набор данных Небраски, который, кажется, включает большую часть Среднего Запада, несмотря на то, что большая часть этой области хорошо за пределами границ Небраски. Другие штаты Среднего Запада такие же, что убивает меня, потому что Средний Запад, как правило, является отличным местом для размещения ветряных турбин, и я действительно хотел бы использовать эти данные.

Я попытался повторно запустить этот sjoin со всеми тремя доступными операциями («пересекается», по умолчанию; «содержит» ; "в пределах"), но никто из них не дает мне того, что я ожидаю, который будет только частью набора данных NREL в пределах границ Небраски.

Что я не понимаю о том, как функция Geo pandas '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')


1 Ответ

0 голосов
/ 21 января 2020

.overlay () был ответ. Спасибо, Пол Х.

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

enter image description here

...