1、分享一下二三维联动的心得 [复制链接] terrait terrait 当前离线 积分 199 9 主题 18 帖子 199 积分 管理员 积分 199 发消息 电梯直达 楼主 发表于 2014-1-10 11:18:06 | 只看该作者 |倒序浏览 |阅读模式 分享下二三维联动的心得:二三维联动容易遇到二维动三维跟着动,然后二维又响应三维动的事件,形成死循环。今天我也做了个跟Silverlight二维图的联动,想了个解决方法,并证明可行。 方法就是:判断鼠标的所属,当二维向三维传递动的响应后,先别急着动,先去判
2、断下鼠标在二维图上还是三维图上,判断如果在三维图上,那根本用不到,因为我们都是鼠标自己控制动的。阻止这个事件。在二维上就动。同样,为了保险也在二维图的动不动函数里添加判断。 本帖子中包含更多资源 您需要 登录 才可以下载或查看,没有帐号?开通 x 收藏0 回复 举报 wushuang wushuang 当前离线 积分 102 0 主题 25 帖子 102 积分 注册会员 注册会员, 积分 102, 距离下一级还需 98 积分 积分 102 发消息 沙发 发表于 2014-1-14 09:22:12
3、 | 只看该作者 本帖最后由 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 求交流。我研究了二三维联动,就是老出问题。请问你实现了是吧
4、 二三维联动,三维展现是基于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 二三维联动,三维展
5、现是基于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的 那就在一个f
6、orm里面拖放map控件和skyline三维显示控件,然后相互设置中心点坐标,视点就可以了啊 回复 支持 反对 举报 shenhubj shenhubj 当前离线 积分 11 0 主题 1 帖子 11 积分 新手上路 积分 11 发消息 6# 发表于 2014-1-16 11:23:37 | 只看该作者 楼主,能贴一点具体事项的代码么?感谢! 回复 支持 反对 举报 海洪 海洪 当前离线 积分 508 0 主题 2 帖子 508
7、 积分 高级会员 积分 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 ==
8、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
9、), level); 缩放等级计算函数:目前二维地图的缩放等级和高度不太一样,要自己去写算法。 最好弄得就是二维有四角定位的api,那就方便了,直接获得skyline的中心点和高度,然后用SGWorld.CoordServices.MoveCoord向左上方移动,根据高度算x,y的移动距离,具体我就不说了,涉及到内部算法问题。左上角右下角获得之后就直接定位二维地图就行了。 只能定cneter和level的,就要把三维中的height转为二维里的level,{"50m","100m","200m","500m","1km","2km","5km","10km","20km","25km
10、","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个坐标点求个距离,用这个作为高度就行,这是公式推导出来的,偏差不大,具体思路我就不公布了。就这么多,肯定好使,我测试过了。






