Більше

GeoPandas: повернення широти і довжини центроїдної точки

GeoPandas: повернення широти і довжини центроїдної точки


Я хотів би повернутилатталонабоxтаyз точкового об’єкта в наступній серії, коли я планую зв’язати їх із API, який я створив, який пов’язує OSM та NetworkX. Центроїди будуть додані як нові вузли для аналізу мережі.

gp.GeoSeries (zones.centroid) .x, іgp.GeoSeries (zones.centroid) .yяк зазначено в документах raiseAttributeError: Об'єкт "GeoSeries" не має атрибута "x"помилка.

Трохи змінивши речі та надрукувавши їхсписок (gp.GeoSeries (zones.centroid))повернути тисячі витончених точок такого формату:

[… , , , , , , , ]

Я використовую наступний код:

імпортувати геопанда як gp-зони = gp.GeoDataFrame.from_file (shp_file) для індексу, рядок у zones.iterrows (): індекс друку, gp.GeoSeries (zones.centroid) # результат: # 9700022.00 POINT (-122.8196050489696 54.0061762412865) (-122.7474362519174 53.99998921974029) # 9700100.00 ТОЧКА (-121.4904983300892 53.98447191612864) # 9700101.00 ТОЧКА (-122.5513619751679 53.73999791511078) # 9700102.00 POINT

Як я можу повернутиxтаyз об'єкта GeoPandas POINT?


Залишивши решту нижче, але головне - це належний доступ до геометрії. Якщо ітерація над рядками, напр.для індексу, рядок у зонах. рядки ():можна просто використовуватиrow.geometry.centroid.xтаrow.geometry.centroid.y. Геометрія - це спеціальний стовпець, включений до GeoDataFrame, тому кожен рядок має атрибут геометрії.
Ви отримуєте доступ до цього атрибута, який міститьстрункийоб'єкт. Цестрункийоб'єкт матиме атрибут,центроїдщо, у свою чергу, містить ashapely.geometry.Point, що має атрибутиxтаy, нарешті, надаючи вам потрібну нерухомість.


(Ця частина була початковою спробою дістатися до x, y за допомогоюкартутаshapely.geometry.Point.)
Я збираюся припустити, що вам потрібен список кортежів (x, y)? Створіть функцію швидкого доступу для атрибутів x і y на aТочкаі використовуватикарту.

Редагувати: Гаразд, я зрозумів, що ви можете отримати неправильний доступ до геометрії в GeoDataFrame. Геометрія - це стовпець у вашому GeoDataFrame, який сам по собі створює ряд. Дзвінокцентроїду цьому стовпці має бути надано нову GeoSeries лише з цих центроїдів. Я підозрюю, що з того, що ви робите, ви берете центроїд кожної вершини в кожному багатокутнику. Я все ще не можу це перевірити, оскільки зараз не можу встановити GeoPandas.

def getXY (pt): return (pt.x, pt.y) centroidseries = zone ['geometry']. centroid centroidlist = map (getXY, centroidseries)

або якщо вам потрібні два окремих списку координат x і y

def getXY (pt): return (pt.x, pt.y) centroidseries = zone ['geometry']. centroid x, y = [list (t) for t in zip (*map (getXY, centroidseries))]

Крім того, ви також повинні мати можливість використовуватиzones.geometry.centroidзамістьzone ['geometry']. центроїд. Так чи інакше, я думаю дзвонитизони.центроїдможе повертати GeoDataFrame замість GeoSeries, що дає вам несподіваний результат, коли ви переносите його в іншу GeoSeries.


Я сам зіткнувся з цією проблемою. Якщо ви хочете, щобxтаyяк окремі стовпці GeoDataFrame, це чудово працює:

gdf ["x"] = gdf.centroid.map (лямбда p: p.x) gdf ["y"] = gdf.centroid.map (лямбда p: p.y)

Починаючи з GeoPandas 0.3.0, ви можете використовувати наданіxтаyзамість цього властивості:

gdf ["x"] = gdf.centroid.x gdf ["y"] = gdf.centroid.y

Це стало легше з GeoPandas 0.3.0.

Тепер ви можете отримати доступxтаyзстрункі окуляривсередині ageopandas GeoSeriesвикористовуючиyour_GeoDataFrame.geometry.xтаyour_GeoDataFrame.geometry.y

(Примітка: Я використовую python 3.6.1, не впевнений у поведінці у 2.7, вибачте)

Джерело на github


Рішення для вилучення центральної точки (широти та довготи) з багатокутника та багатокутника.

імпортувати геопанда як gpd df = gpd.read_file (шлях + 'df.geojson') #Знайти центральну точку df ['Center_point'] = df ['geometry']. centroid #Extract lat and lon from the centerpoint df ["lat "] = df.Center_point.map (лямбда p: px) df [" long "] = df.Center_point.map (лямбда p: py)

Я зіткнувся з подібною проблемою, використовуючи лише геометрію багатокутників, і виявив, що це рішення добре для мене працює, пам’ятайте, що це використання Python-3.6, тому воно може не працювати для Python-2.7.

імпортувати геопанда як gpd зон = gpd.read_file ('file_to_read.shp') для i в діапазоні (0, len (зони)): zones.loc [i, 'centroid_lon'] = zones.geometry.centroid.x.iloc [ i] zones.loc [i, 'centroid_lat'] = zones.geometry.centroid.y.iloc [i]

якщо вам просто потрібен масив масивів центроїдів:

центроїди = np.vstack ([df.centroid.x, df.centroid.y]). T

або як фрейм даних з додатковими стовпцями (наприклад, ім'ям):

pd.DataFrame (np.vstack ([df.name, df.centroid.x, df.centroid.y]). T, стовпці = ['name', 'x', 'y'])

екс.

назва геометрія 0 1 POLYGON ((0,00000 1,00000, 0,00000 0,00000, 1… 1 2 POLYGON ((2,00000 1,00000, 2,00000 0,00000, 3… # ==> # np.vstack ([df.centroid.x, df.centroid.y] ) .T # масив ([[0.5, 0.5], # [2.5, 0.5]])

Ось швидко

df = pd.read_csv ('data/hospitals.csv') df.columns # 'Ownership', 'Lat', 'Long' from shapely.geometry import Point df ['geometry'] = df.apply (лямбда -рядок: Точка (row.Long, row.Lat), вісь = 1)

Потім відтворіть кадр даних за допомогою геопанд

gdf = gpd.DataFrame (df) # створює кадр геоданих з геометрією точки