Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 313

ne_110m_admin_1_states_provinces_shp.prj

ne_110m_admin_1_states_provinces_shp.shx

Мы будем использовать эти файлы в наших примерах.

Нарисуем карту

Для прочтения шейп-файла вам понадобится эта библиотека:

$ pip install pyshp

Теперь введите текст программы, map1.py, который я модифицировал из статьи

в блоге Geospatial Python (http://bit.ly/raster-shape):

def display_shapefile(name, iwidth=500, iheight=500):

import shapefile

from PIL import Image, ImageDraw

r = shapefile.Reader(name)

mleft, mbottom, mright, mtop = r.bbox

# map units

mwidth = mright — mleft

mheight = mtop — mbottom

# scale map units to image units

hscale = iwidth/mwidth

vscale = iheight/mheight

img = Image.new("RGB", (iwidth, iheight), "white")

draw = ImageDraw.Draw(img)

for shape in r.shapes():

pixels = [

(int(iwidth — ((mright — x) * hscale)), int((mtop — y) * vscale))

for x, y in shape.points]

if shape.shapeType == shapefile.POLYGON:

draw.polygon(pixels, outline='black')

elif shape.shapeType == shapefile.POLYLINE:

Карты

405

draw.line(pixels, fill='black')

img.show()

if __name__ == '__main__':

import sys

display_shapefile(sys.argv[1], 700, 700)

Эта программа считывает шейп-файл и проходит по отдельным фигурам. Я ищу

только два типа фигур: многоугольник, который соединяет последнюю точку с на-

чальной, и ломаную линию, которая этого не делает. Я строил свою логику на ос-

нове оригинальной статьи и беглого просмотра документации pyshp, поэтому впол-

не уверен в том, что знаю, как работает программа. Иногда вам просто нужно начать

и затем справляться с возникающими проблемами.

Запустим наш код. Аргументом станет базовое имя для шейп-файла, не содер-

жащее расширения:

$ python map1.py ne_110m_admin_1_states_provinces_shp

Вы должны увидеть что-то похожее на рис. Б.1.

Рис. Б.1. Предварительная карта

406

Приложение Б. За работой

Что ж, программа нарисовала карту, которая напоминает Соединенные Шта-