Фрейм геоданных не определен

Я работаю с Jupiter, ipywidgets и Ipyleaflet, пытаюсь нарисовать полигоны на карте и сохранить их в фрейме геоданных. У меня в ячейке блокнота есть следующее:

zoom = 15

from ipywidgets import Output, interact
import ipywidgets
from __future__ import print_function
import ipyleaflet
import geopandas as gpd
import pandas as pd

# from shapely.geometry import Point, LineString, Polygon
from shapely import geometry


from ipyleaflet import (
    Map,
    Marker,
    TileLayer, ImageOverlay,
    Polyline, Polygon, Rectangle, Circle, CircleMarker,
    GeoJSON,
    DrawControl)

# Create an Output widget
out = Output()

# Define a function to handle interactions
def handle_interaction(change):
    with out:
        print(change)


c = ipywidgets.Box()
c.children = [m]

# keep track of rectangles and polygons drawn on map:
def clear_m():
    global rects,polys
    rects = set()
    polys = set()

clear_m()
rect_color = '#a52a2a'
poly_color = '#00F'

myDrawControl = DrawControl(
rectangle = {'shapeOptions':{'color':rect_color}},
        polygon = {'shapeOptions':{'color':poly_color}}) #,polyline=None)

def handle_draw(self, action, geo_json):
    global rects,polys
    polygon=[]
    for coords in geo_json['geometry']['coordinates'][0][:-1][:]:
        handle_interaction(coords)
        polygon.append(tuple(coords))
    polygon = tuple(polygon)
    handle_interaction(polygon)
    if geo_json['properties']['style']['color'] == '#00F':  # poly
        if action == 'created':
            handle_interaction(" in here")
            polys.add(polygon)
            polygon_geom = geometry.Polygon(polygon)
    
            # Create GeoDataFrame if it doesn't exist
            if gdf2: is None:
                gdf2 = gpd.GeoDataFrame(geometry=[polygon_geom])
            else:
                gdf2 = gdf2.append({'geometry': polygon_geom}, ignore_index=True)
            
        elif action == 'deleted':
            polys.discard(polygon)
    if geo_json['properties']['style']['color'] == '#a52a2a':  # rect
        if action == 'created':
            rects.add(polygon)
        elif action == 'deleted':
            rects.discard(polygon)
myDrawControl.on_draw(handle_draw)
m.add_control(myDrawControl)

Нарисовав фигуры на карте, я вижу

display(out)

[-88.434269, 31.660818] [-88.431051, 31.661439] [-88.431265, 31.660087] [-88.433582, 31.659941] ((-88.434269, 31.660818), (-88.431051, 31.661439), (-88.431265, 31.660087), (-88.433582, 31.659941)) здесь [-88.432166, 31.658474] [-88.429678, 31.65767] [-88.431609, 31.656684] [-88.434054, 31.65778] ((-88.432166, 31.658474), (-88.429678, 31.65767), (-88.431609, 31.656684), (-88.434054, 31.65778)) здесь

перечислены в следующей ячейке (ожидаемые результаты). Однако когда я пытаюсь:

print(gdf2)

Я получил:

NameError: name 'gdf2' is not defined

Что я делаю не так

Вы имеете в виду «gdf2: нет» или «gdf2 нет»?

DVT 14.03.2024 17:21

В этом месте кода имя переменной gdf2 не существует. Итак, вы имеете в виду то, чего не существует. Какой, по вашему мнению, должна быть эта переменная?

John Gordon 14.03.2024 17:26

Отвечает ли это на ваш вопрос? Почему я получаю сообщение «NameError: имя 'df' не определено»?

Joooeey 15.03.2024 13:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

gdf2 — локальная переменная из функции handle_draw. Таким образом, он не определен вне этой функции.

Если вы хотите сохранить его значение, определите его заранее, например.

zoom = 15
gdf2 = None 

Затем используйте global в начале функции handle_draw:

def handle_draw(self, action, geo_json):
    global gdf2 

Примечание: отредактировано, чтобы оставить только ответ

" если gdf2 имеет значение None: " Верно - я допустил ошибку при копировании кода на этот вопрос.

user1592380 14.03.2024 17:57

Не уверен, что вы не вставляете весь свой код или что-то в этом роде, но кроме локального контекста вашей функции, gdf2 действительно нигде не определен. gdf2 должна быть глобальной переменной

Другие вопросы по теме