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
Приложение Б. За работой
Что ж, программа нарисовала карту, которая напоминает Соединенные Шта-