爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 7605|回复: 8

MeteoInfoLab脚本示例:加载地图图层

[复制链接]

新浪微博达人勋

发表于 2015-6-30 09:51:36 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 MeteoInfo 于 2019-5-20 19:15 编辑

应用最广泛的的地图数据应该是shape格式,网络上有很多免费下载资源。MeteoInfoLab中读取shape文件的函数是shaperead,参数即文件名,返回数据包含图形和属性信息的图层对象。矢量图层按照图元类型通常分点、线、面三种,都可以通过geoshow函数加入到地图坐标系(Axesm)中。在geoshow函数中可以指定图层的显示的Symbol(颜色等),可以设置facecolor, edgecolor, size等,这种情况下图层的所有图元都会以同一个Symbol来显示。也可以利用图层的属性信息来生成更复杂的图例(makesymbolspec函数),函数第一个参数是图元类型(point, line, polygon),还需要设置一个属性字段(field='NAME'),然后利用属性数据来设置图例。这里例子中加载了rivers.shp图层,该图层是世界主要河流,这里只显示长江、黄河,用下面的代码处理:
  1. ss = makesymbolspec('line', {'value':'Yangtze', 'color':(0,255,255), 'size':1}, {'value':'Huang He', 'color':(0,255,255), 'size':1}, field='NAME')
  2. geoshow(river_layer, symbolspec=ss)


例子中还加载了中国省会城市点图层,可以在geoshow函数中设置labelfield等参数来给图层添加标注(城市名)。

脚本代码如下:
  1. #Set data folders
  2. basedir = 'D:/MyProgram/Distribution/java/MeteoInfo/MeteoInfo'
  3. mapdir = os.path.join(basedir, 'map')
  4. #Read shape files
  5. bou2_layer = shaperead(os.path.join(mapdir, 'bou2_4p.shp'))
  6. bou1_layer = shaperead(os.path.join(mapdir, 'bou1_4l.shp'))
  7. river_layer = shaperead(os.path.join(mapdir, 'rivers.shp'))
  8. city_layer = shaperead(os.path.join(mapdir, 'res1_4m.shp'))
  9. #Plot
  10. axesm()
  11. geoshow(bou2_layer, edgecolor='lightgray')
  12. geoshow(bou1_layer, facecolor=(0,0,255))
  13. ss = makesymbolspec('line', {'value':'Yangtze', 'color':(0,255,255), 'size':1}, \
  14.     {'value':'Huang He', 'color':(0,255,255), 'size':1}, field='NAME')
  15. geoshow(river_layer, symbolspec=ss)
  16. geoshow(city_layer, facecolor='r', size=4, labelfield='NAME', fontname=u'楷体', fontsize=16, yoffset=15)
  17. xlim(72, 136)
  18. ylim(16, 55)


新的MeteoInfo版本可以只用MeteoInfo -> map目录中shp文件的文件名来加载图层:
  1. #Plot
  2. ax = axesm(tickfontsize=12)
  3. geoshow('cn_province', edgecolor='lightgray')
  4. geoshow('china', edgecolor=(0,0,255))
  5. ss = makesymbolspec('line', {'value':'Yangtze', 'color':(0,255,255), 'size':1}, \
  6.     {'value':'Huang He', 'color':(0,255,255), 'size':1}, field='NAME')
  7. geoshow('rivers', symbolspec=ss)
  8. geoshow('cn_cities', facecolor='r', size=4, labelfield='NAME', fontname=u'楷体', \
  9.     fontsize=16, yoffset=15)
  10. xlim(72, 136)
  11. ylim(16, 55)


运行结果:
Image00860.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-3-2 10:42:55 | 显示全部楼层
谢谢王老师,非常有用!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-10-26 18:59:55 | 显示全部楼层
老师我模仿您这篇写了一段程序,但是长江没有被单独显示出来,您能帮我看下吗?
#Set data folders
basedir = 'D:/MeteoInfo'
mapdir = os.path.join(basedir, 'map')

#Read shape files
bou2_layer = shaperead(os.path.join(mapdir, 'bou2_4p.shp'))
bou1_layer = shaperead(os.path.join(mapdir, 'bou2_4l.shp'))
river_layer = shaperead(os.path.join(mapdir, 'rivers.shp'))

#Plot
fn = 'E:/data.txt'
ncol = numasciicol(fn)
nrow = numasciirow(fn)
a = asciiread(fn,shape=(nrow,ncol))
lon = a[:,0]
lat = a[:,1]
v = a[:,2]
axesm()
geoshow(bou2_layer, edgecolor='lightgray')
geoshow(bou1_layer, facecolor=(0,0,0))
ss=makesymbolspec('line',{'value':'Yangtze', 'color':(188,143,143), 'size':4},field='NAME')
geoshow(river_layer, symbolspec=ss)
layer = scatterm(lon, lat, v, edge=False, size=10)
xlim(100, 122)
ylim(24, 35)
title('(a) PM2.5')
ylabel('Latitude')
xlabel('Longitude')
colorbar(layer)
以上是程序
输出图是这样的:E:/pm2.5
pm2.5.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-10-26 22:19:47 | 显示全部楼层
本帖最后由 MeteoInfo 于 2018-10-26 22:21 编辑
Mr.Sun 发表于 2018-10-26 18:59
老师我模仿您这篇写了一段程序,但是长江没有被单独显示出来,您能帮我看下吗?
#Set data folders
based ...

makesymbolspec方法里如果只有一个图元的设置会自动认为所有图元都用这个符号渲染。可以在MeteoInfoMap加载rivers图层,选中长江,用“输出地图数据”菜单将长江输出为一个shape文件,然后用在脚本中。
或者在makesymbolspec中增加一个不存在图元,比如:
ss=makesymbolspec('line',{'value':'Yangtze', 'color':(188,143,143), 'size':4}, {'value':'***', 'color':(188,143,143), 'size':4},field='NAME')
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-10-26 22:27:47 | 显示全部楼层
MeteoInfo 发表于 2018-10-26 22:19
makesymbolspec方法里如果只有一个图元的设置会自动认为所有图元都用这个符号渲染。可以在MeteoInfoMap加 ...

谢谢老师,成功了,感动!!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-10-26 22:31:00 | 显示全部楼层
MeteoInfo 发表于 2018-10-26 22:19
makesymbolspec方法里如果只有一个图元的设置会自动认为所有图元都用这个符号渲染。可以在MeteoInfoMap加 ...

谢谢老师,成功了,感动!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-5-20 17:25:27 | 显示全部楼层
王老师,您好,我想请问一下,我照着您的程序写的,但是为什么没有显示各个省的边界?我用的shape file文件就是1.8.2版本meteoinfo文件下的map文件,不知道是不是不能用这里面的文件?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-5-20 19:15:52 | 显示全部楼层
不顾一切 发表于 2019-5-20 17:25
王老师,您好,我想请问一下,我照着您的程序写的,但是为什么没有显示各个省的边界?我用的shape file文件 ...

请参考1楼更新的脚本。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-5-21 16:15:53 | 显示全部楼层
MeteoInfo 发表于 2019-5-20 19:15
请参考1楼更新的脚本。

嗯嗯,谢谢老师,我刚刚试了一下,可以的!刚开始学习这个软件,谢谢老师!!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表