Использование геопространственных данных в Python с помощью GeoPandas
Использование геопространственных данных в Python с GeoPandas
Пространственные данные состоят из записей, связанных с местоположениями. Эти данные могут быть получены из GPS-треков, изображений наблюдения Земли и карт. Каждая точка пространственных данных может быть точно размещена на карте, используя системы координат, такие как пары широты/долготы для точного размещения на карте, что позволяет исследовать взаимосвязи между ними.
Истинный потенциал пространственных данных заключается в их способности соединять точки данных и их соответствующие местоположения, создавая бесконечные возможности для продвинутого анализа. Геопространственная наука является новым направлением в области науки о данных, которая стремится использовать геопространственную информацию и извлекать ценные инсайты с помощью пространственных алгоритмов и продвинутых техник, таких как машинное обучение или глубокое обучение, чтобы сделать значимые выводы о том, какие события произошли и каковы их причины. Геопространственная наука позволяет нам узнать, где происходят события и почему они происходят.
GeoPandas – это бесплатный пакет на языке Python, специально разработанный для работы с геопространственной информацией. Он расширяет возможности массивов данных pandas, предоставляя пространственные операции над геометрическими объектами, что облегчает пространственный анализ в Python с использованием инструментов манипулирования данными pandas. Поскольку GeoPandas основан на Pandas, он предлагает простой путь для профессионалов, знакомых с синтаксисом Python, чтобы быстро освоить синтаксис GeoPandas.
- Лучшие инструменты искусственного интеллекта для аналитиков данных 2023
- Введение в базы данных в области науки о данных
- Рождение науки о данных первый в истории тест гипотезы и идеи на Python
1. Установка GeoPandas
Мы должны установить пакет GeoPandas, чтобы иметь возможность использовать его. Однако важно отметить, что GeoPandas зависит от других библиотек, которые также должны быть установлены, чтобы использовать его без проблем. Этими зависимостями являются shapely, Fiona, pyproj и rtree.
Существуют два способа загрузки пакета GeoPandas. Во-первых, вы можете использовать conda для установки пакета GeoPandas. Этот метод рекомендуется, так как он автоматически установит зависимости GeoPandas без необходимости устанавливать их самостоятельно. Вы можете выполнить следующую команду для установки GeoPandas:
conda install geopandas
Второй способ – использовать pip, который является стандартным инструментом для установки пакетов в Python. Однако, при использовании этого способа потребуется установка остальных указанных зависимостей.
pip install geopandas
После установки пакета GeoPandas вы можете импортировать его в свой код Python с помощью следующей команды:
import geopandas as gpd
2. Чтение и запись пространственных данных
GeoPandas используется для чтения пространственных данных и преобразования их в GeoDataFrame. Однако важно отметить, что существуют два основных типа пространственных данных:
- Векторные данные: Векторные данные описывают особенности географии местоположений Земли с использованием дискретной геометрии, используя такие термины, как точка, линия и полигон.
- Растровые данные: Растровые данные кодируют мир как поверхность, представленную в виде сетки. Каждый пиксель этой сетки представляет собой непрерывное значение или категориальный класс.
GeoPandas в основном работает с векторными данными. Однако он может быть использован совместно с другими пакетами на языке Python для работы с растровыми данными, такими как rasterio. Вы можете использовать мощную функцию geopandas.read_file() для чтения большинства векторных пространственных данных. Существуют два основных типа данных векторных пространственных данных:
-
Shapefile: Shapefile – это наиболее распространенный формат данных и считается стандартным форматом данных отрасли. Он состоит из трех файлов, которые сжаты и обычно предоставляются в виде zip-файла:
.shp файл: Этот файл содержит геометрию формы.
.dbf файл: Этот файл содержит атрибуты для каждой геометрии,
.shx файл: Это файл индекса формы, который помогает связать атрибуты с формами.
-
GeoJSON: Это новый формат файла геопространственных данных, выпущенный в 2016 году. Поскольку он состоит только из одного файла, его использование проще по сравнению с Shapefile.
В этой статье мы будем использовать функцию geopandas.read_file() для чтения файла GeoJSON, размещенного на GitHub, содержащего геопространственные данные о различных районах города Барселона.
Давайте начнем с загрузки данных и вывода первых пяти столбцов с использованием следующего кода:
url = 'https://raw.githubusercontent.com/jcanalesluna/bcn-geodata/master/districtes/districtes.geojson'
districts = gpd.read_file(url)
districts.head()
Затем, для записи данных в файл, мы можем использовать функцию GeoDataFrame.to_file() для записи данных в файл Shapefile по умолчанию, но вы можете преобразовать его в GeoJSON с использованием параметра driver.
districts.to_file("districts.geojson", driver="GeoJSON")
3. Свойства GeoDataFrames
Поскольку GeoDataFrames является подклассом pandas DataFrame, он наследует множество свойств. Однако есть некоторые различия, главное различие заключается в том, что он может хранить столбцы геометрии (также известные как GeoSeries) и выполнять пространственные операции. Столбец геометрии в GeoDataFrame может содержать различные типы векторных данных, включая точки, линии и полигоны. Однако только один столбец считается активной геометрией, и все пространственные операции будут выполняться на основе этого столбца.
Еще одной важной особенностью является то, что каждый столбец содержит информацию о связанной системе координат (CRS), которая указывает, где находятся кандидаты на Земле. Причина, по которой эта функция является ключевой, заключается в том, что если вам нужно объединить два пространственных набора данных, вам нужно убедиться, что они выражены в одной и той же CRS, иначе вы получите неправильные результаты. Информация о CRS хранится в атрибуте crs в GeoPandas:
districts.crs
Теперь, когда мы установили правильную проекцию CRS, мы готовы исследовать атрибуты GeoDataFrames.
4. Исследование GeoDataFrames
GeoPandas имеет четыре полезных метода и атрибута, которые могут использоваться для исследования данных. Мы рассмотрим эти четыре метода:
- Площадь
- Центроид
- Граница
- Расстояние
4.1. Площадь
Атрибут area возвращает вычисленную площадь геометрии. В приведенном ниже примере мы вычислим площадь каждого района в км2.
districts['area'] = districts.area / 1000000
districts['area']
4.2. Центроид
Второй атрибут – это центроид, который возвращает центральную точку геометрии. В приведенном ниже фрагменте кода мы добавим новый столбец и сохраняем центроид для каждого района:
districts['centroid']=districts.centroid
districts['centroid']
4.3. Граница
Третий метод – это атрибут границы, который вычисляет границу полигона для каждого района. Приведенный ниже код возвращает границу и сохраняет ее в отдельный столбец:
districts['boundary']=districts.boundary
4.4. Расстояние
Метод distance вычисляет минимальное расстояние от определенной геометрии до конкретного места. Например, в приведенном ниже коде мы вычислим расстояние от церкви Саграда Фамилия до центроидов каждого района в Барселоне. После этого мы добавим расстояние в квадратных километрах и сохраним его в новом столбце.
from shapely.geometry import Point
sagrada_fam = Point(2.1743680500855005, 41.403656946781304)
sagrada_fam = gpd.GeoSeries(sagrada_fam, crs=4326)
sagrada_fam= sagrada_fam.to_crs(epsg=2062)
districts['sagrada_fam_dist'] = [float(sagrada_fam.distance(centroid)) / 1000 for centroid in districts.centroid]
5. Визуализация данных с помощью GeoPandas
Визуализация данных является важным шагом для лучшего понимания данных. Визуализация с использованием GeoPandas аналогична визуализации с помощью Pandas, довольно проста и прямолинейна. Это делается с помощью функции GeoDataFrame.plot(), которая основана на пакете python matplotlib.
Начнем с изучения Барселоны, создав базовую диаграмму для ее районов:
ax = districts.plot(figsize=(10,6))
Это очень простая диаграмма, которая не дает нам много информации. Однако мы можем сделать ее более информативной, раскрасив каждый район в разный цвет.
ax = districts.plot(column='DISTRICTE', figsize=(10,6), edgecolor='black', legend=True)
Наконец, мы можем добавить больше информации к нашей диаграмме, добавив центроиды районов.
import contextily
import matplotlib.pyplot as plt
ax = districts.plot(column='DISTRICTE', figsize=(12,6), alpha=0.5, legend=True)
districts["centroid"].plot(ax=ax, color="green")
contextily.add_basemap(ax, crs=districts.crs.to_string())
plt.title('Цветная карта с центроидом Барселоны')
plt.axis('off')
plt.show()
Затем мы рассмотрим очень важную функцию GeoPandas, которая является пространственным отношением и как они могут быть связаны друг с другом.
6. Определение пространственных отношений
Пространственные данные связаны друг с другом в пространстве. GeoPandas использует пакеты pandas и shapely для пространственных отношений. В этом разделе рассматриваются общие операции. Существуют два основных способа объединения GeoPandas DataFrames: атрибутивное и пространственное объединение. В этом разделе мы рассмотрим оба из них.
6.1. Атрибутивное объединение
Атрибутивное объединение позволяет объединить два GeoPandas DataFrames, используя не геометрические переменные, что делает его аналогичным обычным операциям объединения в Pandas. Операция объединения выполняется с помощью метода pandas.merge(), как показано в приведенном ниже примере. В этом примере мы присоединим данные о населении Барселоны к нашим геопространственным данным, чтобы добавить к ним больше информации.
import pandas as pd
pop =pd.read_csv('2022_padro_sexe.csv', usecols=['Nom_Districte','Nombre'])
pop = pd.DataFrame(pop.groupby('Nom_Districte')['Nombre'].sum()).reset_index()
pop.columns=['NOM','population_22']
districts = districts.merge(pop)
districts
6.2. Пространственные соединения
С другой стороны, пространственные соединения объединяют наборы данных на основе пространственных отношений. В примере ниже мы определим районы, в которых есть велосипедные дорожки. Сначала мы загрузим данные, как показано в коде ниже:
url = 'https://opendata-ajuntament.barcelona.cat/resources/bcn/CarrilsBici/CARRIL_BICI.geojson'
bike_lane = gpd.read_file(url)
bike_lane = bike_lane.loc[:,['ID','geometry']]
bike_lane.to_crs(epsg=2062, inplace=True)
Для пространственного соединения двух наборов данных мы можем использовать функцию sjoin(). Функция sjoin() принимает четыре основных аргумента: первый – это GeoDataFrame, второй аргумент – это GeoDataFrame, который мы добавим к первому GeoDataFrame, третий аргумент – это тип соединения, и последний аргумент – предикат, который определяет пространственное отношение, которое мы хотим использовать для сопоставления двух GeoDataFrame. Самые распространенные частичные отношения – пересекаются, содержат и находятся внутри. В этом примере мы будем использовать параметр пересекаются.
lanes_districts = gpd.sjoin(districts, bike_lane, how='inner', predicate='intersects')
lanes_districts
В этой статье я познакомил вас с анализом геопространственных данных с использованием библиотеки с открытым исходным кодом GeoPandas. Мы начали с загрузки пакета GeoPandas, а затем обсудили различные типы геопространственных данных и способы их загрузки. Наконец, мы исследовали основные операции для работы с геопространственным набором данных. Хотя с анализом геопространственных данных еще есть многое, что можно исследовать, этот блог станет отправной точкой в вашем обучении. Юссеф Рафаат – исследователь компьютерного зрения и дата-сайентист. Его исследования сосредоточены на разработке алгоритмов компьютерного зрения в реальном времени для медицинских приложений. Он также работал дата-сайентистом более 3 лет в области маркетинга, финансов и здравоохранения.