资源描述
分享一下二三维联动的心得
[复制链接]
terrait
terrait 当前离线
积分
199
9
主题
18
帖子
199
积分
管理员
积分
199
发消息
电梯直达
楼主
发表于 2014-1-10 11:18:06 | 只看该作者 |倒序浏览 |阅读模式
分享下二三维联动的心得:二三维联动容易遇到二维动三维跟着动,然后二维又响应三维动的事件,形成死循环。今天我也做了个跟Silverlight二维图的联动,想了个解决方法,并证明可行。
方法就是:判断鼠标的所属,当二维向三维传递动的响应后,先别急着动,先去判断下鼠标在二维图上还是三维图上,判断如果在三维图上,那根本用不到,因为我们都是鼠标自己控制动的。阻止这个事件。在二维上就动。同样,为了保险也在二维图的动不动函数里添加判断。
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?开通
x
收藏0
回复
举报
wushuang
wushuang 当前离线
积分
102
0
主题
25
帖子
102
积分
注册会员
注册会员, 积分 102, 距离下一级还需 98 积分
积分
102
发消息
沙发
发表于 2014-1-14 09:22:12 | 只看该作者
本帖最后由 wushuang 于 2014-1-14 09:23 编辑
求交流。我研究了二三维联动,就是老出问题。请问你实现了是吧
回复 支持 反对
举报
skyline大叔
skyline大叔 当前离线
积分
518
0
主题
3
帖子
518
积分
高级会员
积分
518
发消息
板凳
发表于 2014-1-15 09:15:08 | 只看该作者
wushuang 发表于 2014-1-14 09:22
求交流。我研究了二三维联动,就是老出问题。请问你实现了是吧
二三维联动,三维展现是基于skyline的,我不知道你的二维展现是基于哪个软件的,是arcgis engine、arcgis for silverlight还是基于超图的,一般都可以相互嵌入开发的
回复 支持 反对
举报
wushuang
wushuang 当前离线
积分
102
0
主题
25
帖子
102
积分
注册会员
积分
102
发消息
地板
发表于 2014-1-16 09:10:27 | 只看该作者
skyline大叔 发表于 2014-1-15 09:15
二三维联动,三维展现是基于skyline的,我不知道你的二维展现是基于哪个软件的,是arcgis engine、arcgis ...
我的是基于arcgis engine的
回复 支持 反对
举报
skyline大叔
skyline大叔 当前离线
积分
518
0
主题
3
帖子
518
积分
高级会员
积分
518
发消息
5#
发表于 2014-1-16 09:25:04 | 只看该作者
wushuang 发表于 2014-1-16 09:10
我的是基于arcgis engine的
那就在一个form里面拖放map控件和skyline三维显示控件,然后相互设置中心点坐标,视点就可以了啊
回复 支持 反对
举报
shenhubj
shenhubj 当前离线
积分
11
0
主题
1
帖子
11
积分
新手上路
积分
11
发消息
6#
发表于 2014-1-16 11:23:37 | 只看该作者
楼主,能贴一点具体事项的代码么?感谢!
回复 支持 反对
举报
海洪
海洪 当前离线
积分
508
0
主题
2
帖子
508
积分
高级会员
积分
508
发消息
7#
发表于 2014-1-17 11:26:55 | 只看该作者
全部的代码恐怕不能分享了,不过部分片段和思路可以给大家:
三维skyline部分:加载时候绑定OnFrame
代码:
var minfo = SGWorld.Window.GetMouseInfo();
if (minfo.X <= 0 || minfo.Y <= 0) return;
var pos = SGWorld.Window.PixelToWorld(minfo.X, minfo.Y, -1);
if (pos == null||flag2d) return;//上面说的flag
var center_position = SGWorld.Window.CenterPixelToWorld(0);
var height = SGWorld.Navigate.GetPosition().Altitude;
var level = CheckHeightLevel(height);//缩放等级计算函数
mp.centerAndZoom(new BMap.Point(center_position.Position.X, center_position.Position.Y), level);
缩放等级计算函数:目前二维地图的缩放等级和高度不太一样,要自己去写算法。
最好弄得就是二维有四角定位的api,那就方便了,直接获得skyline的中心点和高度,然后用SGWorld.CoordServices.MoveCoord向左上方移动,根据高度算x,y的移动距离,具体我就不说了,涉及到内部算法问题。左上角右下角获得之后就直接定位二维地图就行了。
只能定cneter和level的,就要把三维中的height转为二维里的level,{"50m","100m","200m","500m","1km","2km","5km","10km","20km","25km","50km","100km","200km","500km","1000km","2000km"} 这个是百度api的3-18级的level,转换下就行了。不过还是不理想。因为缩放级别会跳,从一个跳到另一个的时候很突兀。所以没有四角定位api的二维地图做联动的时候要慎重。
百度的二连三效果还是非常不错的,不过就是百度地图有加偏,哎
回复 支持 反对
举报
海洪
海洪 当前离线
积分
508
0
主题
2
帖子
508
积分
高级会员
积分
508
发消息
8#
发表于 2014-1-17 11:33:45 | 只看该作者
至于二维转三维就简单了,一般的二维地图api里都能获得四角坐标,根据四角坐标获得中心点,高度用同一个维度或者经度的2个坐标点求个距离,用这个作为高度就行,这是公式推导出来的,偏差不大,具体思路我就不公布了。就这么多,肯定好使,我测试过了。
展开阅读全文