应用matplotlib绘制地图

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from math import sqrt

import shapefile

from matplotlib import pyplot

from descartes import PolygonPatch

from shapely.geometry import Polygon, LineString, Point

# used to import dictionary data to shapely

from shapely.geometry import asShape

from shapely.geometry import mapping

# calculate the size of our matplotlib output

GM = (sqrt(5) - 1.0) / 2.0

W = 8.0

H = W * GM

SIZE = (W, H)

# colors for our plots as hex

GRAY = '#00b700'

BLUE = '#6699cc'

YELLOW = '#ffe680'

# functions slightly modified from Sean Gilles http://toblerity.org/shapely/

# used for drawing our results using matplotlib

def plot_coords_line(axis, object, color='#00b700'):

    x, y = object.xy

    ax.plot(x, y, 'o', color=color, zorder=1)

def plot_coords_lines(axis, object, color='#999999'):

    for linestring in object:

        x, y = linestring.xy

        ax.plot(x, y, 'o', color=color, zorder=2)

def plot_line(axis, object, color='#00b700'):

    x, y = object.xy

    ax.plot(x, y, color=color, linewidth=3, zorder=1)

def plot_lines(axis, object, color='#00b700'):

    for line in object:

        x, y = line.xy

        ax.plot(x, y, color=color, alpha=0.4, linewidth=1, solid_capstyle='round', zorder=2)

def set_plot_bounds(object, offset=1.0):

    """

    Creates the limits for x and y axis plot

    :param object: input shapely geometry

    :param offset: amount of space around edge of features

    :return: dictionary of x-range and y-range values for

    """

    bounds = object.bounds

    x_min = bounds[0]

    y_min = bounds[1]

    x_max = bounds[2]

    y_max = bounds[3]

    x_range = [x_min - offset, x_max + offset]

    y_range = [y_min - offset, y_max + offset]

    return {'xrange': x_range, 'yrange': y_range}

# open roads Shapefile that we want to clip with pyshp

roads_london = shapefile.Reader(r"../geodata/roads_london_3857.shp")

# open circle polygon with pyshp

clip_area = shapefile.Reader(r"../geodata/clip_area_3857.shp")

# access the geometry of the clip area circle

clip_feature = clip_area.shape()

# convert pyshp object to shapely

clip_shply = asShape(clip_feature)

# create a list of all roads features and attributes

roads_features = roads_london.shapeRecords()

# variables to hold new geometry

roads_clip_list = []

roads_shply = []

# run through each geometry, convert to shapely geom and intersect

for feature in roads_features:

    roads_london_shply = asShape(feature.shape.__geo_interface__)

    roads_shply.append(roads_london_shply)

    roads_intersect = roads_london_shply.intersection(clip_shply)

    # only export linestrings, shapely also created points

    if roads_intersect.geom_type == "LineString":

        roads_clip_list.append(roads_intersect)

# open writer to write our new shapefile too

pyshp_writer = shapefile.Writer()

# create new field

pyshp_writer.field("name")

# convert our shapely geometry back to pyshp, record for record

for feature in roads_clip_list:

    geojson = mapping(feature)

    # create empty pyshp shape

    record = shapefile._Shape()

    # shapeType 3 is linestring

    record.shapeType = 3

    record.points = geojson["coordinates"]

    record.parts = [0]

    pyshp_writer._shapes.append(record)

    # add a list of attributes to go along with the shape

    pyshp_writer.record(["empty record"])

# save to disk

pyshp_writer.save(r"../geodata/roads_clipped.shp")

# setup matplotlib figure that will display the results

fig = pyplot.figure(1, figsize=SIZE, dpi=90, facecolor="white")

# add a little more space around subplots

fig.subplots_adjust(hspace=.5)

# ###################################

#            first plot

#  display sample line and circle

# ###################################

# first figure upper left drawing

# 222 represents the number_rows, num_cols, subplot number

ax = fig.add_subplot(221)

# our demonstration geometries to see the details

line = LineString([(0, 1), (3, 1), (0, 0)])

polygon = Polygon(Point(1.5, 1).buffer(1))

# use of descartes to create polygon in matplotlib

# input circle and color fill and outline in blue with transparancy

patch1 = PolygonPatch(polygon, fc=BLUE, ec=BLUE, alpha=0.5, zorder=1)

# add circle to axis in figure

ax.add_patch(patch1)

# add line using our function above

plot_line(ax, line)

# draw the line nodes using our function

plot_coords_line(ax, line)

# subplot title text

ax.set_title('Input line and circle')

# define axis ranges as list [x-min, x-max]

# added 1.5 units around object so not touching the sides

x_range = [polygon.bounds[0] - 1.5, polygon.bounds[2] + 1.5]

# y-range [y-min, y-max]

y_range = [polygon.bounds[1] - 1.0, polygon.bounds[3] + 1.0]

# set the x and y axis limits

ax.set_xlim(x_range)

ax.set_ylim(y_range)

# assing the aspect ratio

ax.set_aspect(1)

# ##########################################

#            second plot

#    display original input circle and roads

# ##########################################

ax = fig.add_subplot(222)

# draw our original input road lines and circle

plot_lines(ax, roads_shply, color='#3C3F41')

patch2 = PolygonPatch(clip_shply, fc=BLUE, ec=BLUE, alpha=0.5, zorder=1)

ax.add_patch(patch2)

# write title of second plot

ax.set_title('Input roads and circle')

# define the area that plot will fit into plus 600m space around

x_range = set_plot_bounds(clip_shply, 600)['xrange']

y_range = set_plot_bounds(clip_shply, 600)['yrange']

ax.set_xlim(*x_range)

ax.set_ylim(*y_range)

ax.set_aspect(1)

# remove the x,y axis labels by setting empty list

ax.set_xticklabels([])

ax.set_yticklabels([])

# ###################################

#            third plot

#  display sample intersection

# ###################################

ax = fig.add_subplot(223)

patch2 = PolygonPatch(polygon, fc=BLUE, ec=BLUE, alpha=0.5, zorder=1)

ax.add_patch(patch2)

# run the intersection detail view

intersect_line = line.intersection(polygon)

# plot the lines and the line vertex to plot

plot_lines(ax, intersect_line, color='#3C3F41')

plot_coords_lines(ax, intersect_line, color='#3C3F41')

# write title of second plot

ax.set_title('Line intersects circle')

# define the area that plot will fit into

x_range = set_plot_bounds(polygon, 1.5)['xrange']

y_range = set_plot_bounds(polygon, 1)['yrange']

ax.set_xlim(*x_range)

ax.set_ylim(*y_range)

ax.set_aspect(1)

# ###################################

#            fourth plot

#  showing results of clipped roads

# ###################################

ax = fig.add_subplot(224)

# plot the lines and the line vertex to plot

plot_lines(ax, roads_clip_list, color='#3C3F41')

# write title of second plot

ax.set_title('Roads intersect circle')

# define the area that plot will fit into

x_range = set_plot_bounds(clip_shply, 200)['xrange']

y_range = set_plot_bounds(clip_shply, 200)['yrange']

ax.set_xlim(x_range)

ax.set_ylim(y_range)

ax.set_aspect(1)

# remove the x,y axis labels by setting empty list

ax.set_xticklabels([])

ax.set_yticklabels([])

# draw the plots to the screen

pyplot.show()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容