Я работаю с 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
не существует. Итак, вы имеете в виду то, чего не существует. Какой, по вашему мнению, должна быть эта переменная?
Отвечает ли это на ваш вопрос? Почему я получаю сообщение «NameError: имя 'df' не определено»?
gdf2 — локальная переменная из функции handle_draw
. Таким образом, он не определен вне этой функции.
Если вы хотите сохранить его значение, определите его заранее, например.
zoom = 15
gdf2 = None
Затем используйте global в начале функции handle_draw
:
def handle_draw(self, action, geo_json):
global gdf2
Примечание: отредактировано, чтобы оставить только ответ
" если gdf2 имеет значение None: " Верно - я допустил ошибку при копировании кода на этот вопрос.
Не уверен, что вы не вставляете весь свой код или что-то в этом роде, но кроме локального контекста вашей функции, gdf2
действительно нигде не определен. gdf2
должна быть глобальной переменной
Вы имеете в виду «gdf2: нет» или «gdf2 нет»?