学了没记等于没学 --贺浩
上次用qgis做了openstreet的地图输出,完全没有任何记录,现在重新学并记下来
工具
- Qgis
- Openlayer plugin
暂时先这么开始
- 使用openlayer加载osm和bing aerial 图层;
- 选中区域, 用vector OSM工具中download data下载osm数据,保存成.osm 格式,接下来可以读取该osm文件并为所欲为了;
- 同样使用Vector->OSM工具将下载的osm文件读成xml文件;
- 接下来,使用OSM的第三个工具,提取感兴趣的点、线和多边形;
在这之前都没有什么难度 。
我们注意到,图层管理器中多了一项 ××--polylines,这是因为我感兴趣的主要是道路。现在可以关掉osm图层专心研究polylines了
- 双击polylines图层可以查看和修改其属性,包括目标的名字,性质,像素宽度等等,如下图所示。
-
按理来说,现在选择感兴趣区域,感兴趣图层,手工点菜单栏Project->Save as image 就OK了,但是我还有更多的需求,希望选取一大片区域,把这片区域的OSM图保存成我希望的大小,那么另开一段。
将OSM数据转换为shp文件并保存为图片
1 . 首要我们要知道,想要将图层保存下来,最好将图层转化成shp格式,因此我们将刚才保存的db文件保存成shp文件
- 接下来用一段代码来总结这篇笔记 T T
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 25 18:19:28 2018
CONVERT SHP FILE TO IMAGE
@author: hehao
"""
import os
import sys
import mapnik # for drawing
from osgeo import ogr # for open shapefile
shp_path = 'your_path/*.shp'
X = int(10240)
Y = int(10240)
if X <= 0 or Y <= 0:
print('Image size should be positive')
exit()
layer_type = 'pl'
xmin = xmax = ymin = ymax = None
def render_img(width, height, layer, output, minx, miny, maxx, maxy, layer_type):
m = mapnik.Map(width, height)
s = mapnik.Style()
r = mapnik.Rule()
symbolizer = None
if layer_type == "pt":
print('not implement!')
return
elif layer_type == "pl":
symbolizer = mapnik.LineSymbolizer()
symbolizer.stroke = mapnik.Color('#ff0000')
symbolizer.width = 0.3
elif layer_type == "pg":
symbolizer = mapnik.PolygonSymbolizer()
symbolizer.fill = mapnik.Color('#ff0000')
else:
return
r.symbols.append(symbolizer)
s.rules.append(r)
m.append_style('style', s)
mlayer = mapnik.Layer(str("test_layer"))
print('layer param: ', layer)
mlayer.datasource = mapnik.Shapefile(file=layer)
mlayer.styles.append('style')
m.layers.append(mlayer)
tile_bounds = (minx, miny, maxx, maxy)
box = mapnik.Box2d(*tile_bounds)
m.zoom_to_box(box)
print(output)
mapnik.render_to_file(m, output)
ds = ogr.Open(shp_path)
layer = ds.GetLayer(0)
if xmin is None:
xmin, xmax, ymin, ymax = layer.GetExtent()
render_img(X, Y, shp_path, './out.png', xmin, ymin, xmax, ymax, layer_type)
这里放一个怎么使用Qgis下载OSM数据并检索的官方教程