Как преобразовать шейп-файл в полный список точек широты и долготы

Я пытаюсь преобразовать шейп-файл в список точек широты и долготы, которые представляют каждую точку, определенную шейп-файлом. Чтение файла с помощью geopandas и использование функции .plot() отображает эти точки в виде графика, но мне бы хотелось, чтобы точки были необработанными. Я попытался перебрать полигоны в geopandas .geometry и сохранить все точки внутри полигонов. Я нанес эти точки на график, чтобы проверить, дают ли они точное представление о площади, но это не так. Я сделал все это с помощью следующего кода:

import re
import geopandas as gpd
import matplotlib.pyplot as plt

def geoToList(geodataframe):
    points = []
    for s in geodataframe.geometry:iq
        s = str(s)
        s = re.sub('[^0-9., ]+', '', s).split(',')
        s = map(lambda x: x.strip(), s)
        s = map(lambda x: (float(x.split()[0]), float(x.split()[1])), s)
        points.extend(list(s))   
    return points

habitat = gpd.read_file('desktop/species_19377/species_19377.shp')
#borough = borough.to_crs(epsg=4326)

points = geoToList(habitat)
x = [point[0] for point in points]
y = [point[1] for point in points]

plt.scatter(x, y)
plt.show() #representation of the points in all polygons
habitat.plot() #representtation of the points I want

Мне нужна функция, которая возвращает список точек, которые могут быть нанесены на график и выглядят так же, как вывод habitat.plot()

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

Любая помощь будет оценена по достоинству!


person asheets    schedule 22.04.2018    source источник


Ответы (1)


Чтобы извлечь все точки из набора полигонов/мультиполигонов, вы можете сделать что-то вроде этого:

from shapely.geometry import MultiPolygon

def points_from_polygons(polygons):
    points = []
    for mpoly in polygons:
        if isinstance(mpoly, MultiPolygon):
            polys = list(mpoly)
        else:
            polys = [mpoly]
        for polygon in polys:
            for point in polygon.exterior.coords:
                points.append(point)
            for interior in polygon.interiors:
                for point in interior.coords:
                    points.append(point)
    return points

points = points_from_polygons(habitat.geometry)
x = [point.x for point in points]
y = [point.y for point in points]
person joris    schedule 23.04.2018
comment
Спасибо за Ваш ответ! Первое решение дает мне ошибку значения: доступ к атрибуту x предоставляется только для геометрии Point. Второй дает мне ошибку атрибута: объект Polygon не имеет атрибута x. У меня версия 0.3.0. Я что-то делаю не так? - person asheets; 23.04.2018
comment
Ах, я почему-то предположил, что геометрия, которую вы получили, была точками. Обновлен ответ - person joris; 23.04.2018
comment
Я поиграл с этим решением, и, похоже, оно генерирует вывод, очень похожий на вывод функции, которую я разместил выше, которая дает некоторые точки, определяющие внешний вид, но не определяющие внутреннюю часть. Я, конечно, мог бы использовать это, чтобы получить внутренние точки, но решение, которое я имею в виду, было бы грязным и дорогостоящим в вычислительном отношении. Есть ли более простой способ получить все точки внутри фигуры? - person asheets; 23.04.2018
comment
Да, я хотел добавить комментарий, что это не обрабатывало интерьер, но это тоже легко добавить. Смотрите обновленную функцию, чтобы также перебирать интерьеры. - person joris; 23.04.2018