多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > web前端 > htmlcss > 百度地圖與HT for Web結(jié)合的GIS網(wǎng)絡(luò)拓?fù)鋺?yīng)用

百度地圖與HT for Web結(jié)合的GIS網(wǎng)絡(luò)拓?fù)鋺?yīng)用

來源:程序員人生   發(fā)布時(shí)間:2014-12-13 08:38:26 閱讀次數(shù):3789次

在《HT for Web整合OpenLayers實(shí)現(xiàn)GIS地圖利用》篇中介紹了HT for Web與OpenLayers的整合,很多朋友反應(yīng)國內(nèi)用得比較多的還是百度地圖,雖然HT整合百度地圖原理與OpenLayers1致,但不同GIS引擎客戶端結(jié)合代碼細(xì)節(jié)還是有很多差異,自定義地圖風(fēng)格更是完全不1樣,為此我再開篇介紹下HT與百度地圖整合的方案,這次我們將改進(jìn)之前的例子,除代表城市的拓?fù)涔?jié)點(diǎn)外,再增加連線連接省會(huì)和城市,實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)滏溌返幕顒?dòng)效果。

Screen Shot 2014-12-03 at 11.43.05 PMScreen Shot 2014-12-03 at 11.18.02 PMScreen Shot 2014-12-03 at 11.16.55 PM

百度地圖有多種客戶端SDK,我們這里用的自然是JavaScript版的API,百度地圖的2.0版增加了很多新功能,例如可以自定義地圖樣式模板,本例中我們特地設(shè)置成style:’midnight’的深色背景風(fēng)格。插入map的位置與OpenLayers也不1樣,通過mapDiv.firstChild.firstChild.appendChild(view);插入,zIndex這些屬性都還好不需要設(shè)置。

坐標(biāo)轉(zhuǎn)換方面從經(jīng)緯度轉(zhuǎn)換成平面坐標(biāo)是map.pointToPixel函數(shù),通過node.setPosition(map.pointToPixel(new BMap.Point(lon, lat)));可設(shè)置ht.Node對(duì)應(yīng)的平面邏輯坐標(biāo),通過map.pixelToPoint(new BMap.Pixel(x,y))可將平面坐標(biāo)轉(zhuǎn)換成經(jīng)緯度坐標(biāo),我們?cè)诒O(jiān)聽節(jié)點(diǎn)圖元被拖拽結(jié)束的endMove需要重新計(jì)算當(dāng)前位置的經(jīng)緯度時(shí)用到。

地圖數(shù)據(jù)方面每一個(gè)省的省會(huì)城市都是第1個(gè)出現(xiàn),因此我們構(gòu)建了size大1點(diǎn)的帶漸進(jìn)色的圖元朝表省會(huì)城市,其他城市構(gòu)建時(shí)同時(shí)構(gòu)建ht.Edge的連線與省會(huì)節(jié)點(diǎn)連接,同時(shí)引入HT的ht-flow.js插件,只需要graphView.enableFlow(60);1句話就能夠啟動(dòng)活動(dòng)連線功能,每條edge連線還可以有很多flow.*相干的活動(dòng)參考可控制活動(dòng)效果,這里的簡單例子我們不需要做定制,保持HT默許的活動(dòng)參數(shù)就足夠酷了。

另外通過graphView.setLayers(['edgeLayer', 'nodeLayer']);我們?yōu)橥負(fù)湓O(shè)置了兩個(gè)層,node.setLayer(‘nodeLayer’);和edge.setLayer(‘edgeLayer’)使得圖元節(jié)點(diǎn)全部顯現(xiàn)于連線之上,從這個(gè)細(xì)節(jié)大家可以發(fā)現(xiàn),之前需要在GIS的SDK擴(kuò)大的功能也能夠通過在HT的GraphView實(shí)現(xiàn),地圖僅僅是作為背景,業(yè)務(wù)邏輯代碼完全在更靈活強(qiáng)大的HT模型中進(jìn)行。

其他方面細(xì)節(jié)還由監(jiān)聽map的縮放等操作對(duì)拓?fù)鋱D元重新定位,和監(jiān)聽交互決定GraphView還是Map進(jìn)行控制等都與之前的文章類似,這里就不再介紹了,以下為操作視頻、抓圖和源代碼供大家參考,這樣的結(jié)合可完善的將百度地圖豐富的地圖數(shù)據(jù)信息,與HT強(qiáng)大的邏輯拓?fù)涔δ芟嘟Y(jié)合,否則光靠百度地圖SDK的API的擴(kuò)大方式,用戶只能做些簡單的效果,例如連線活動(dòng)等效果都遠(yuǎn)不如HT這樣1行代碼就弄定來的容易。http://v.youku.com/v_show/id_XODQxMDcwNjQ0.html

Screen Shot 2014-12-03 at 11.12.43 PM

Screen Shot 2014-12-03 at 9.43.40 PMScreen Shot 2014-12-04 at 12.31.13 AM

var dataModel = new ht.DataModel(); var graphView = new ht.graph.GraphView(dataModel); var map = null; function init() { map = new BMap.Map("map"); var point = new BMap.Point(116.404, 39.915); map.addTileLayer(new BMap.TrafficLayer()); map.centerAndZoom(point, 4); map.enableScrollWheelZoom(); map.addControl(new BMap.NavigationControl()); map.setMapStyle({ features: ["road", "building","water","land"], style:'midnight' }); var view = graphView.getView(); view.className = 'graphView'; var mapDiv = document.getElementById('map'); mapDiv.firstChild.firstChild.appendChild(view); map.addEventListener('movestart', function(e){ view.style.opacity = 0; }); map.addEventListener('moveend', function(e){ view.style.opacity = 1; resetPosition(); }); map.addEventListener('dragstart', function(e){ view.style.opacity = 0; }); map.addEventListener('dragend', function(e){ view.style.opacity = 1; resetPosition(); }); map.addEventListener('zoomstart', function(e){ view.style.opacity = 0; }); map.addEventListener('zoomend', function(e){ view.style.opacity = 1; resetPosition(); }); graphView.setLayers(['edgeLayer', 'nodeLayer']); graphView.enableFlow(60); graphView.enableToolTip(); graphView.getToolTip = function(event){ var data = this.getDataAt(event); if(data instanceof ht.Node){ return '城市:' + data.s('note') + ' 經(jīng)度:' + data.lonLat.lng + ' 維度:' + data.lonLat.lat; } return null; }; graphView.isVisible = function(data){ return map.getZoom() > 1 || this.isSelected(data); }; graphView.isNoteVisible = function(data){ return map.getZoom() > 8 || this.isSelected(data); }; graphView.getLabel = function(data){ if(data instanceof ht.Node){ return '經(jīng)度:' + data.lonLat.lng + ' 維度:' + data.lonLat.lat; } }; graphView.isLabelVisible = function(data){ return map.getZoom() > 9 || this.isSelected(data); }; graphView.mi(function(e){ if(e.kind === 'endMove'){ graphView.sm().each(function(data){ if(data instanceof ht.Node){ var position = data.getPosition(), x = position.x + graphView.tx(), y = position.y + graphView.ty(); data.lonLat = map.pixelToPoint(new BMap.Pixel(x,y)); } }); } }); graphView.setAutoScrollZone(⑴); graphView.handleScroll = function(){}; graphView.handlePinch = function(){}; var handleClick = function(e){ var data = graphView.getDataAt(e); if(data){ e.stopPropagation(); } else if(e.metaKey || e.ctrlKey){ e.stopPropagation(); } }; graphView.getView().addEventListener('click', handleClick, false); graphView.getView().addEventListener('dblclick', handleClick, false); graphView.getView().addEventListener(ht.Default.isTouchable ? 'touchstart' : 'mousedown', handleClick, false); window.addEventListener("resize", function(e) { graphView.invalidate(); }, false); var color = randomColor(), province = null; lines = china.split(' '); for(var i=0; i<lines.length; i++) { line = lines[i].trim(); if(line.indexOf('【') === 0){ color = randomColor(); province = null; }else{ var ss = line.split(' '); if(ss.length === 3){ var node = createNode(parseFloat(ss[1].substr(3)), parseFloat(ss[2].substr(3)), ss[0].substr(3), color); if(province){ var edge = new ht.Edge(province, node); edge.s({ 'edge.center': true, 'edge.width': 1, 'flow': true }); edge.setLayer('edgeLayer'); dataModel.add(edge); }else{ province = node; node.s({ 'shape.gradient': 'radial.center', 'border.type': 'circle', 'border.width': 1, 'border.color': 'rgba(200, 200, 200, 0.5)' }); node.setSize(15, 15); } } } } } function createNode(lon, lat, name, color){ var node = new ht.Node(); node.s({ 'shape': 'circle', 'shape.background': color, 'note': name, 'label.background': 'rgba(255, 255, 0, 0.5)', 'select.type': 'circle' }); node.setLayer('nodeLayer'); node.setSize(10, 10); var lonLat = new BMap.Point(lon, lat); node.setPosition(map.pointToPixel(lonLat)); node.lonLat = lonLat; graphView.dm().add(node); return node; } function resetPosition(e){ graphView.tx(0); graphView.ty(0); dataModel.each(function(data){ if(data instanceof ht.Node){ var lonLat = data.lonLat, position = map.pointToPixel(lonLat); data.setPosition(position.x,position.y); } }); }


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 69视频在线免费观看 | 冲田杏梨j和l超乳w真性中出 | 欧美日韩加勒比一区二区三区 | 国产精品久久精品 | 午夜美女写真福利写视频 | 欧美色阁 | h在线观看网站 | 大学生一级毛片高清版 | 亚洲久久久 | 国产精品综合 | 日韩性大片免费 | 国产日本欧美在线观看乱码 | 在线观看中文字幕亚洲 | 一本之道无吗一二三区 | 久久精品综合 | 福利网站在线观看 | 日韩欧美亚洲在线 | 精品国产欧美一区二区三区成人 | 国产区久久 | 一级做a爱片性色毛片武则天五则 | 91精品久久久久亚洲国产 | 国内视频自拍 | 最新精品亚洲成a人在线观看 | 中文字幕色视频 | 国内交换一区二区三区 | 亚洲一区二区精品 | 欧美在线观看a | 欧美成人免费观看国产 | 精品国产精品久久一区免费式 | 视频一区二区免费 | 亚洲精品区一区二区三区四 | 综合欧美日韩 | 欧美激情bbbbbxxxxⅹ | 亚洲婷婷影院 | 国产成人啪精品午夜在线播放 | 亚洲成人自拍 | 久久伊人成人 | 精品国产综合区久久久久久 | 久久精品亚洲精品一区 | 欧洲美女性做爰 | 在线成人免费观看国产精品 |