应用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()
应用matplotlib绘制地图的更多相关文章
- matplotlib绘制动画
matplotlib从1.1.0版本以后就开始支持绘制动画,具体使用可以参考官方帮助文档.下面是一个很基本的例子: """ A simple example of an ...
- 用Matplotlib绘制二维图像
唠叨几句: 近期在做数据分析,需要对数据做可视化处理,也就是画图,一般是用Matlib来做,但Matlib安装文件太大,不太想直接用它,据说其代码运行效率也很低,在网上看到可以先用Java做数据处理, ...
- 使用ArcGIS API for Silverlight + Visifire绘制地图统计图
原文:使用ArcGIS API for Silverlight + Visifire绘制地图统计图 最近把很久之前做的统计图又拿出来重新做了一遍,感觉很多时候不复习,不记录就真的忘了,时间是最好的稀释 ...
- Python学习(一) —— matplotlib绘制三维轨迹图
在研究SLAM时常常需要对其输出的位姿进行复现以检测算法效果,在ubuntu系统中使用Python可以很好的完成相关的工作. 一. Ubuntu下Python的使用 在Ubuntu下使用Python有 ...
- python使用matplotlib绘制折线图教程
Matplotlib是一个Python工具箱,用于科学计算的数据可视化.借助它,Python可以绘制如Matlab和Octave多种多样的数据图形.下面这篇文章主要介绍了python使用matplot ...
- 使用matplotlib绘制多个图形单独显示
使用matplotlib绘制多个图形单独显示 一 代码 import numpy as np import matplotlib.pyplot as plt #创建自变量数组 x= np.linspa ...
- 用matplotlib绘制每次交易的盈亏三角形
用matplotlib绘制每次交易的盈亏三角形 结果: 代码: python def plot_trade_triangle(self): # plot each trade as a trade-t ...
- 使用EXCEL绘制三维地图(超简单的五分钟绘制地图方法,妈妈再也不用担心我不会画地图啦~)
博主为从区域规划转行地图学的小学渣一枚,最近处理数据希望对结果进行三维可视化,意外发现从小用到大的EXCEL可以绘制地图且功能非常强大,在这里做一下简单介绍,希望可以给看官提供些许帮助.那下面就开始吧 ...
- Python——使用matplotlib绘制柱状图
Python——使用matplotlib绘制柱状图 1.基本柱状图 首先要安装matplotlib(http://matplotlib.org/api/pyplot_api.htm ...
随机推荐
- Unity3D协同程序(Coroutine)
摘要下: 1. coroutine, 中文翻译"协程".这个概念可能有点冷门,不过百度之,说是一种很古老的编程模型了,以前的操作系统里进程调度里用到过,现在操作系统的进程调度都是根 ...
- JavaScript作用域原理(二)——预编译
JavaScript是一种脚本语言, 它的执行过程, 是一种翻译执行的过程.并且JavaScript是有预编译过程的,在执行每一段脚本代码之前, 都会首先处理var关键字和function定义式(函数 ...
- Javascript定时器(二)——setTimeout与setInterval
一.解释说明 1.概述 setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段 setInterval:周期性地调用一个函数(function)或者执行一段代码. 2.语法 set ...
- Android 自动补全提示输入AutoCompleteTextView、 MultiAutoCompleteTextView
以在搜索框搜索时,自动补全为例: 其中还涉及到一个词,Tokenizer:分词器,分解器. 上效果图: MainActivity.java: package com.joan.testautocoml ...
- MySQL(Navicat)运行.sql文件时报错:[Err] 2006 - MySQL server has gone away 的解决方法
背景: 今天导入一个数据量很大的.sql文件时,报错: 原因: 可能是sql语句过长,超过mysql通信缓存区最大长度. 解决:1. 编辑 MySQL 安装目录下的 my.ini,在最后添加以下内容: ...
- Eclipse快捷键大全(转载)
一.实用类快捷键 1 常用熟悉的快捷键 CTRL+C(复制).CTRL+X(剪切).CTRL+Z(撤销).CTRL+F(查找).CTRL+H(搜索文件或字符串).CTRL+Y(重做).CTRL+/(双 ...
- 50款免费 PSD 名片设计模板源文件下载《下篇》
名片是陌生人之间建立联系的最便捷.最有效的工具.名片它可能是给你的客户留下正面的印象第一步,另一方面,名片是一个企业最重要和最符合成本效益的营销工具之一,尤其是对于刚刚起步的企业.这里收集了50款免费 ...
- 基于HTML5技术的电力3D监控应用(二)
上篇介绍了我们电力项目的基本情况,我们选用HTML5技术还是顶着很大压力,毕竟HTML5技术性能行不行,浏览器兼容性会不会有问题,这些在项目选型阶段还是充满疑惑,项目做到现在终于快收尾了我们才敢松口气 ...
- 基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解
概述: ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈 ...
- 利用navigator对象在浏览器中检查插件
利用navigator对象在浏览器中检查插件,实现的代码如下. // IE4+.firefox.chrome.safari.opera中,利用navigator检测插件 ,name为插件的名字 fun ...