前面幾篇文章主要是講了加載天地圖、在天地點上循環加載標注點並給標注點添加事件、根據標注點坐標確定地圖的顯示范圍、在天地圖顯示坐標軌跡以及 在天地圖上畫多邊形,電子范圍。
本文再講一點復雜操作。
1.在地圖上展示一些標注點,這些標注點兩兩相連。 在線與不在線是兩種不同顏色的圖標。
2.如果標注點之間距離大於60千米,用紅色虛線連接。如果標注點之間的距離小於60千米剛用藍色虛線連接。
3.點擊線條,在兩個標注點顯示兩個標注點的距離,將兩個點用實線連接。並且給相連的兩個標注點大圖標來表示,大圖標也根據在線不在線使用不同的顏色。點擊此標注點的時候,其他標注點恢復原狀。
4.輸入起點和終點,地圖上連接兩個點,並用實線連接兩個點,兩個點的圖標用比較醒目的圖標。
步驟:
1.准備數據。
點數據:
- //標注點數據
- var lnglats = [
- {"B":"23.2","L":"113.4","PName":"2222","Status":1},
- {"B":"23.7","L":"113.8","PName":"第四個點","Status":0},
- {"B":"23.1","L":"113.7","PName":"7777","Status":1},
- {"B":"23.5","L":"113.3","PName":"8888","Status":1}];
讓標注點兩兩相連。線條數據。這里手工添,也可以寫個函數來生成。 注意這里數據的組織。
- //兩兩相連的數據。第一個點和第二個點是一條線。第三個點和第四個點是一條線……依次類推
- var LinePoints = [
- {"B":"23.2","L":"113.4","PName":"2222","Status":1},
- {"B":"23.7","L":"113.8","PName":"第四個點","Status":1},
- {"B":"23.2","L":"113.4","PName":"2222","Status":1},
- {"B":"23.1","L":"113.7","PName":"7777","Status":1},
- {"B":"23.2","L":"113.4","PName":"2222","Status":1},
- {"B":"23.5","L":"113.3","PName":"8888","Status":1},
- {"B":"23.7","L":"113.8","PName":"第四個點","Status":1},
- {"B":"23.1","L":"113.7","PName":"7777","Status":1},
- {"B":"23.7","L":"113.8","PName":"第四個點","Status":1},
- {"B":"23.5","L":"113.3","PName":"8888","Status":1},
- {"B":"23.1","L":"113.7","PName":"7777","Status":1},
- {"B":"23.5","L":"113.3","PName":"8888","Status":1}
- ];
2.根據坐標點計算中心點和縮放級別,並加載天地圖。參見前面的文章。略。
3.把標注點和點名加載到地圖上。參見前面的文章。 略
4.連線操作。以及給天地圖上的線添加點擊事件。
- //根據連線LinePoints數組進行兩兩相連。
- //給線條添加點擊事件。
- function showSLine() {
- var lineconfig={
- strokeColor: "rgb(0,68,102)",
- strokeWeight: 2,
- strokeOpacity: 1,
- strokeStyle:"dashed"
- };
- var disconfig = {//測距工具的配置
- strokeColor:"blue", //折線顏色
- strokeWeight:"3px", //折線的寬度,以像素為單位
- strokeOpacity:0.5, //折線的透明度,取值范圍0 - 1
- strokeStyle:"solid" //折線的樣式,solid或dashed
- };
- //創建測距工具對象
- lineTool = new TPolylineTool(map,disconfig);
- //循環遍歷線條數組
- for (var i = 0; i < LinePoints.length; i = i + 2) {
- var j=i+1;
- var k=i/2;
- points[k]=[];
- points[k].push(new TLngLat(LinePoints[i].L, LinePoints[i].B));
- points[k].push(new TLngLat(LinePoints[j].L, LinePoints[j].B));
- SLine[k] = new TPolyline(points[k],lineconfig);//創建線條的對象
- points[k].dis=lineTool.getDistance(points[k]);//計算一條線兩個點之間距離
- if(points[k].dis>60000){//大於60的用紅色
- SLine[k].setStrokeColor("red");
- }
- SLine[k].id=k;
- SLine[k].distance=LinePoints[i].distance;
- SLine[k].LineName=LinePoints[i].PName+"-"+LinePoints[j].PName;//給線條命名。就是兩個點名中間多一個“-”.用來在模擬點擊的時候知道是模擬點擊到的哪一條線。
- (function() {//給線條添加點擊事件。
- var l=SLine[k];
- SLineclick[k] = TEvent.addListener(l, "click",function() {//線的點擊事件
- //點擊線的第一件是是把地圖上的線條恢復到原始狀態。就是把所有的線變成虛線。
- for(var i=0;i<SLine.length;i++){
- SLine[i].setStrokeStyle("dashed");
- }
- l.setStrokeStyle("solid");//把當前線設為實線。
- var thepoints=l.getLngLats();//獲取線兩端的點,
- thepointL1=thepoints[0][0]/100000;
- thepointL2=thepoints[1][0]/100000;
- thepointL1=thepointL1.toFixed(3);
- thepointL2=thepointL2.toFixed(3);//ie5.5+
- var dispoints=[];
- var discenterArr=[];
- var discenterP={};//線兩個端點點的中心坐標,在這里添加距離顯示
- for(var j=0;j<lnglats.length;j++){
- //點擊線,把地圖上的標注恢復到原始狀態。
- if (lnglats[j].Status == 1) {//恢復初始圖標
- iconMaker[j].setIcon(icon);
- } else {
- iconMaker[j].setIcon(icon1);
- }
- //如果lnglats數組中的點的L值與線條的端點的L值相差在0.01以內,我們就認為它是同一個點。
- //也就是說我們點線條的時候,這個標注點將作為線條的端點來進行變化。
- if(Math.abs(lnglats[j].L-thepointL1)<0.01){
- if(lnglats[j].Status == 1){
- iconMaker[j].setIcon(icon2);
- }else{
- iconMaker[j].setIcon(icon3);
- }
- dispoints.push(new TLngLat(lnglats[j].L, lnglats[j].B));
- discenterArr.push(lnglats[j]);
- }
- if(Math.abs(lnglats[j].L-thepointL2)<0.01){
- if(lnglats[j].Status == 1){
- iconMaker[j].setIcon(icon2);
- }else{
- iconMaker[j].setIcon(icon3);
- }
- dispoints.push(new TLngLat(lnglats[j].L, lnglats[j].B));
- discenterArr.push(lnglats[j]);
- }
- }
- //點擊線時,在線條的中心位置,顯示兩個點的距離,也就是線條長度。
- discenterP.L=(parseFloat(discenterArr[0].L)+parseFloat(discenterArr[1].L))/2;
- discenterP.B=(parseFloat(discenterArr[0].B)+parseFloat(discenterArr[1].B))/2;
- var distance=lineTool.getDistance(dispoints);
- distance=distance/1000;
- distance=distance.toFixed(1);
- var disconfig = {
- text:distance+'KM',
- offset:new TPixel(10,10),
- position:new TLngLat(discenterP.L,discenterP.B)
- };
- //創建地圖文本對象
- map.removeOverLay(disLabel);
- disLabel=new TLabel(disconfig);
- disLabel.setBorderColor("rgb(40,150,205)");
- map.addOverLay(disLabel);
- });
- })();
- //向地圖上添加線
- map.addOverLay(SLine[k]);
- }
- }
5.模擬點擊事件。搜索兩個點的點名,觸發兩個點之間連線的點擊事件。地圖上將兩個點突出顯示。並用實線將兩個點相連。在兩個點中間位置顯示距離。
- var LineName=[];
- $(document).ready(function(){
- //輸入兩個點名。地圖上顯示兩個點相連的效果。
- $("#user_loadq_icon").click(function(){
- var start_point=$("#start_point").val();
- var end_point=$("#end_point").val();
- if(start_point==""||end_point==""){
- return;
- }
- var pointName=start_point+"-"+end_point;
- var pointName1=end_point+"-"+start_point;
- LineName.length=0;
- LineName.push(pointName);
- LineName.push(pointName1);
- //遍歷SLine。查找名字。
- for(var i=0;i<SLine.length;i++){
- if(SLine[i].LineName ==LineName[0] || SLine[i].LineName ==LineName[1] ){
- TEvent.trigger(SLine[i],"click");//找到名字之后模擬點擊線條。觸發點擊事件。連接兩個點。
- }
- }
- })
- })
到這里就基本實現了要達到的效果。
效果圖:
初始狀態:
點擊線條:
搜索連接(模擬點擊事件):
天地圖系列暫時先到這里。 其實天地圖有時候不是特別穩定。 可能其他地圖會好一點點。
其實就是對接口的靈活運用而已。說難不難,說簡單也不簡單。
同樣的接口,在不同的人手里可以發揮出不同的作用。
歡迎交流。
如果對它感興趣可以下載,項目下載地址:https://github.com/liusaint/tiandituMap
演示地址:http://runningls.com/demos/tianditu/index.html?to=loadline