爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4483|回复: 4

[vbscript] 用脚本绘制堆叠地图(stack maps)

[复制链接]

新浪微博达人勋

发表于 2019-12-31 10:46:48 | 显示全部楼层 |阅读模式

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

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

x
缘起
那天看到坛友的问题,一时兴起,写了个演示的脚本:

其实,surfer 本身有一个堆叠地图的例子,叫 StackedMaps.srf。
用脚本实现的好处是,可以避免许多重复的鼠标操作,尤其遇到需要反复制作同类图形的时候。
问题
但是当时画的参考线条没有普适性,只要改变任何参数,这4条连接拐角的参考线就错位了。
画这 4 条拐角的连接线起码涉及到旋转角度、倾斜角度,可惜在帮助文件里面翻了半天也没有看到换算公式,里面提到的参考书我也没有。
求解
于是自己在纸上乱画,胡乱蒙了两个公式:
1、旋转:
xt = x0+(x-x0)*cos(rotation)-(y-y0)*sin(rotation)
​
yt = y0+(x-x0)*sin(rotation)+(y-y0)*cos(rotation)
​
其中
                (xt, yt) - 旋转之后的坐标
                (x0, y0) - 旋转中心坐标
                (x, y) - 要旋转的坐标
                rotation - 旋转角度
2、倾斜:
yt = y0 + (y-y0)*sin(tilt)
其中
                yt - 倾斜之后的 y 坐标
                y0 - 旋转中心的 y 坐标
                y - 要倾斜的 y 坐标
                tilt - 倾斜角度
得道
将就能用,可是 surfer 并没有告诉我们 map(包含坐标轴、地图等图层) 外框和里面的 overlays(具体的等值线图、线框图等图层) 拐角之间的关系,而我们的参考连接线是连接 overlays 拐角的。
当然要计算也不是不可以,把 map 外框减去 axes 的标注、刻度等占用的空间,剩下就是 overlays 的空间了。
可是感觉好烦,要考虑太多参数,标注要考虑字体、字号、标注位置等,刻度也要考虑方向、长度等参数。
想了一个取巧的方案:
1、先把要 stack 的地图都生成,把所有坐标轴全部取消刻度、标注,那么 map 的拐角就是 overlays 的拐角啦;
2、把各地图移动到合适的位置进行堆叠;
3、画连接拐角的参考线;
4、再设置各个 map 的坐标轴属性。

换了几个文件,换了几个参数试验,还可以。
stack_maps_with_auto_reference_lines.BAS (4.46 KB, 下载次数: 8)

评分

参与人数 1金钱 +22 贡献 +6 收起 理由
chengxf + 22 + 6 很给力!

查看全部评分

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

新浪微博达人勋

发表于 2020-1-1 19:06:43 | 显示全部楼层
感谢分享  
参考线画好后就不能调整视角了,不然就错位了。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-1-2 08:22:56 | 显示全部楼层
zbl1339 发表于 2020-1-1 19:06
感谢分享  
参考线画好后就不能调整视角了,不然就错位了。

涉及到投影方式(正交、透视)、旋转角度、倾斜角度、视域角度、坐标轴刻度长度、坐标轴刻度标注、坐标轴标题等参数,如果能找到它们的换算公式,就可以做到随时把拐角连接线放到正确的位置。

surfer 帮助只有片言只语的介绍,具体的公式可能还是要自行推导,我暂时做不到。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-1-2 10:21:48 | 显示全部楼层
holz 发表于 2020-1-2 08:22
涉及到投影方式(正交、透视)、旋转角度、倾斜角度、视域角度、坐标轴刻度长度、坐标轴刻度标注、坐标轴 ...

调整好角度之后,再画四条多段线也并不麻烦。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-1-2 17:04:57 | 显示全部楼层
本来每个对象都应该有自己的 top, left, width, height 属性,如果将 mapframe 的尺寸减去各 axis 的尺寸就能得到 4 各正确的拐角。

可惜,surfer 里面各个 axis 对象的 top, left, width, height 属性都返回无穷大,根本无法利用。

而要手动计算各 axis 的实际尺寸,涉及到其中 12 个属性,实在太无聊了。

目前来说,只要能将涉及 ViewDistance, ViewFOV, ViewProjection, ViewRotation, ViewTilt 属性的坐标变换公式找到,就可以基本满足生产需求了。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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