Простое тематическое отображение шейп-файла с использованием Python?

37

Я хочу визуализировать географические данные в Python, не используя ArcGIS / ArcPy, и составить карту.

В интернете я нашел, как сделать тематическую карту с помощью Python :

Вот код, который я пробовал:

import shpUtils
import matplotlib.pyplot as plt

shpRecords = shpUtils.loadShapefile('C:\\Users\\shapefile.shp')

for i in range(0,len(shpRecords)):
    x = []
    y = []
    for j in range(0,len(shpRecords[i]['shp_data']['parts'][0]['points'])):

    tempx = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['x'])
    tempy = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['y'])
    x.append(tempx)
    y.append(tempy)
    plt.fill(x,y)

plt.axis('equal')
plt.title("Testing")
plt.show()

Однако, когда я запускаю это, он дает мне случайные цвета.

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

Это очень неясно в приведенной выше ссылке, где он обсуждает только использование цветов ...

Возможно, мне понадобятся дополнительные модули для этого, такие как descartes и PySAL ?

NYannickske
источник

Ответы:

62

Я не знаю ArcPy, но я работаю с шейп-файлами и растром в Python в течение многих лет

  1. Для обработки шейп-файлов в Python существует множество модулей, таких как osgeo / ogr , Fiona , Pysal или Pyshp ( shpUtils - один из них и не самый используемый) и другие, см. Pypi: GIS и примеры на gis.stackexchange и множество примеров на Интернет (не только на английском языке). Большинство из них намного старше, чем ArcPy (или arcgisscripting) ...
  2. для обработки растра можно использовать osgeo / gdal , стандарт
  3. Для обработки геопространственных геометрий, есть стройная
  4. Для построения геометрии вы можете использовать matplotlib и, возможно, descartes , «расширение» matplotlib для областей, но также и многие другие модули, см. Pypi: построение графиков и такие модули, как mayavi для трехмерного представления (также matplotlib)
  5. Существуют также такие модули, как mapnik, которые дают вам возможность: 1) читать шейп- файл и 4) создавать графики с помощью модуля Pycairo .

После этого это как ГИС:

  • Вы используете модули 1) для открытия, сохранения шейп-файлов и выполнения процедур с другими модулями, такими как numpy или scipy, если хотите.
  • Вы можете использовать shapely для манипулирования и анализа геометрических объектов (буфер и т. д.).
  • Вы можете использовать matplotlib для построения геометрии, но matplotlib не знает, что вы хотите построить. Это ваша работа с модулями 1) или 3), чтобы определить, что строить (атрибуты и т. Д.) И как.

Если я хочу визуализировать один определенный столбец моего шейп-файла, как я могу реализовать это в коде?

Итак, вы должны изучить matplotib и другие модули. Вы должны изучить ArcPy, это то же самое ... (в Интернете есть много отличных учебных пособий, особенно для matplolib, и легче, чем ArcPy, потому что это чистый Python).

Некоторые примеры только с Python

введите описание изображения здесь

Геологическая карта (шейп-файл полигона) с цветами на основе атрибута

введите описание изображения здесь

3D-точки (шейп-файл PointZ) с цветом на основе атрибута

введите описание изображения здесь

3D-точки (точечный шейп-файл с атрибутом z) и 3D-линия (шейп-файл PolyLineZ) на матрице высот и на растре, задрапированном на поверхность матрицы высот.

введите описание изображения здесь

Топографический профиль со значениями z и цветами на основе атрибутов (геологические формации = поперечное сечение) исходного шейп-файла (шейп-файл полилинии)

введите описание изображения здесь

DEM (GeoTIFF) с модулем Mayavi2

введите описание изображения здесь

DEM (ESRI ascii grid, .asc) и Point shape-файлы (с z в качестве атрибута) с модулем visvis

введите описание изображения здесь

Скважины (3D-буфер полилинииZ с цветами на основе атрибута (геологические формации), с поверхностью сетки, рассчитанной с помощью модулей numpy и matplotlib из шейп-файла точек (с z в качестве атрибута), визуализированных с помощью модуля visvis

ген
источник
16

У меня были похожие проблемы, когда я хотел быстро визуализировать шейп-файлы, и я всегда находил способ Matplotlib довольно долгим для решения такой маленькой задачи. Вместо этого я разработал модуль «Python Geographic Visualizer» или GeoVis для краткости. Обновление: v0.2.0 вышла с множеством новых функций.

С его помощью визуализация шейп-файлов не может быть проще:

import geovis
geovis.ViewShapefile("C:/yourshapefile.shp")

Вуаля, ваша карта всплывает как изображение в окне Tkinter, и вы также можете сохранить карту в файл изображения. Стилизация, раскраска и добавление нескольких слоев на карту также возможны, и в новейшей версии вы также можете классифицировать на основе атрибутов и увеличивать масштаб в конкретном регионе. На карте ниже geovis загрузил и категорически раскрасил все провинции мира GADM примерно за 5 минут. Вы можете скачать GeoVis здесь , где вы также можете прочитать больше о том, как его использовать.

введите описание изображения здесь

Целью является как простая установка, так и простота использования, поэтому GeoVis может использовать любой, кто имеет Python и не требует никаких других модулей, поскольку он может использовать встроенный Tkinter Canvas в качестве средства визуализации. Но настоятельно рекомендуется иметь или получить Aggdraw, PIL или PyCairo, которые также можно использовать в качестве средств визуализации и которые намного быстрее и качественнее.

Backdraw - ваш шейп-файл, который необходимо распаковать с помощью системы координат широта / долгота - он еще не обрабатывает проекции или преобразования.

Карим Бахгат
источник
14

Я наткнулся на несколько уроков, посвященных этой теме, которыми я хотел бы поделиться:

Вы также можете подумать об использовании R: Как создать привлекательную карту хороплета в R?

blah238
источник
1

В 2019 году самый простой способ сделать тематическую карту из шейп- файла в python - это геопанда .

Пример из документации: http://geopandas.org/mapping.html

import geopandas
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
world['gdp_per_cap'] = world.gdp_md_est / world.pop_est
world.plot(column='gdp_per_cap')
davemfish
источник