爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6148|回复: 5

MeteoInfoLab脚本示例:inpolygon

[复制链接]

新浪微博达人勋

发表于 2015-6-26 11:45:09 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2018-3-24 11:19 编辑

inpollygon函数是用来判断带坐标(x/y)的数据是否在某个或者一组多边形(Polygon)中,返回的结果中如果做多边形内则值为1,否则值为-1。下面一个例子演示了利用一个shape文件和inpolygon函数生成这种0、1数据。

1、生成格点数据的坐标(x/y),arange1函数生成一个1维数组,三个参数分别为起始值,个数和步长。用meshgrid函数生成x/y二维数组。

2、读取shape文件,返回一个图层m_china。

3、利用数组a的inpolygon函数生成一个新数组b,b中多边形内的点的值为True,其它为False。

4、将b转为 int 类型(True -> 1, False -> 0)。

5、利用数组b的savegrid方法将数组b及其坐标信息保存到一个Surfer ASCII grid格式的文件中。

6、绘图,这是为了测试一下。数组b中的1用红色的点表示,0用灰色的点显示。

脚本程序:
  1. #Create x/y vectorx = arange1(60, 80, 1)
  2. y = arange1(10, 50, 1)
  3. mx, my = meshgrid(x, y)

  4. #Read shape file
  5. m_china = shaperead('D:/Temp/map/china.shp')

  6. #inpolygon function
  7. b = inpolygon(mx, my, m_china)

  8. #Convert boolean array to int
  9. b = b.astype('int')

  10. #Save grid data
  11. #b.savegrid(x, y, 'D:/Temp/test.dat')

  12. #Plot
  13. axesm()
  14. geoshow(m_china)
  15. ss = makesymbolspec('point', {'value':0, 'color':'lightgray', 'size':2, 'edge':False}, {'value':1, 'color':'red', 'size':2, 'edge':False})
  16. layer = scatterm(x, y, b, symbolspec=ss)


Image00856.png

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-6-27 14:37:34 | 显示全部楼层
王老师好 ,请问这些函数在MeteoInfo中能用吗?谢谢
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-6-27 16:55:25 | 显示全部楼层
kmdqlb 发表于 2015-6-27 14:37
王老师好 ,请问这些函数在MeteoInfo中能用吗?谢谢

这些是专门为MeteoInfoLab设计的函数,当然MeteoInfo里也都有相应的功能,但实现起来比较麻烦。这也是为什么要开发MeteoInfoLab的一个重要原因。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-3-23 23:01:53 | 显示全部楼层
MeteoInfo 发表于 2015-6-27 16:55
这些是专门为MeteoInfoLab设计的函数,当然MeteoInfo里也都有相应的功能,但实现起来比较麻烦。这也是为 ...

王老师您好,您说的“meteoinfo里也有相应的功能,但实现起来比较麻烦”,您能给我说下大致的思路么?我对meteoinfolab不太熟啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-3-24 09:59:46 | 显示全部楼层
MeteoInfo 发表于 2015-6-27 16:55
这些是专门为MeteoInfoLab设计的函数,当然MeteoInfo里也都有相应的功能,但实现起来比较麻烦。这也是为 ...

王老师您好,我根据您的代码,只是更改了文件路径,但是出现了下面的错误,请问这是什么原因啊?
捕获.JPG
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-10-3 20:21:19 | 显示全部楼层
利用此方法,计算某一区域内,最大值,最小值,平均值,脚本仅供参考:
f = addfile('F:/DataSet/ncep/hgt.mon.mean.nc')
var = f['hgt'][0,'500','10:60','60:140']
temp = var
#print var.dimvalue(1)
#x = arange(60, 140, 1.0)
#y = arange(10, 60, 1.0)
x = var.dimvalue(1)
y = var.dimvalue(0)
mx, my = meshgrid(x,y)
#Read shape file
m_china = shaperead('F:/MeteoInfo/MeteoInfo/Map/china.shp')
#inpolygon function
b = inpolygon(mx, my, m_china)
#Convert boolean array to int
b = b.astype('int')
#print b.shape
#Save grid data
#b.savegrid(x, y, 'D:/Temp/test.dat')

#Plot
axesm()
geoshow(m_china)
ss = makesymbolspec('point', {'value':0, 'color':'lightgray', 'size':2, 'edge':False}, {'value':1, 'color':'red', 'size':2, 'edge':False})
#ss = makesymbolspec('point', {'value':(-10000,0), 'color':'b', 'marker':'m', 'size':6}, \
#    {'value':(0,10000), 'color':'r', 'marker':'+', 'size':6})
layer = scatterm(mx, my,b,symbolspec=ss)
layer = contourm(var)
#layer = contourfm(x, y, b, 20)
colorbar(layer)
nx = var.dimlen(1)
ny = var.dimlen(0)
for j in arange(ny):
    for i in arange(nx):
        if(b[j,i]==0):
            temp[j,i] = nan
#print temp[16,:]
xid = argmax(temp)%33
yid = argmax(temp)/33
#print xid,yid
print 'maxvalue: ',max(temp),'[x,y]',x[xid],y[yid]
xid = argmin(temp)%33
yid = argmin(temp)/33
print 'minvalue: ',min(temp),'[x,y]',x[xid],y[yid]
print 'meanvalue: ',mean(temp)
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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