本文實例分享了html5 canvas可拖曳省份的中國地圖實現方法,供大家參考,具體內容如下
1.資料取得
繪製地圖需要省份邊界座標,理論上可以每次都用百度API取得資料並繪圖,但為了增加效率,首先將所有座標都取得下來並存入資料庫中。
新建省份資料數組
輪詢該數組,根據省份名稱請求百度API獲取坐標數據,並將數據以ajax方式放鬆給php
var myGeo = new BMap.Geocoder(); (function(){ for(var i = 0;i < allZoneData.length;i++){ getAllZone(allZoneData[i].name,allZoneData[i].been,allZoneData[i].id); } })(); //name为省份名,been表示是否去过,id为唯一标识,cir为省份圈号(有可能一个省份有两部分封闭圆圈构成) function getAllZone (name,been,id) { var data,temp; var bdary = new BMap.Boundary(); bdary.get(name, function(rs){ var count = rs.boundaries.length; for(var j = 0; j < count; j++){ var ply = new BMap.Polygon(rs.boundaries[j], {strokeWeight: 2, strokeColor: "#ff0000"}); data = ply.getPath(); $.ajax({ url: "addData.php", type:"POST", data: {'data':data,'name' : name,'cir':j,'been':been,'id':id}, success: function(txt){ console.log(txt); }, error: function(){ alert('添加数据出错!'); } }); } }); }
php得到資料後,解析資料並將資料儲存到事先建置好的資料庫
<?php header("content-type:text/html; charset=utf-8"); $data = $_REQUEST['data']; $name = $_REQUEST['name']; $cir = $_REQUEST['cir']; $been = $_REQUEST['been']; $id = $_REQUEST['id']; $con = mysql_connect("localhost","……","……"); if (!$con){ die('Could not connect: ' . mysql_error()); } mysql_select_db("……", $con); mysql_set_charset('utf8',$con); foreach ($data as $temp){ $sql = "insert into place (id,name,lng,lat,cir,been) values ('".$id."', '".$name."', '".$temp['lng']."','".$temp['lat']."','".$cir."','".$been."')"; if (!mysql_query($sql,$con)){ die('Error: ' . mysql_error()); } } mysql_close($con); echo 'Success'; ?>
2.畫地圖(base地圖在mapCanvas圖層)
輪詢省份數組,並以ajax方式請求該省份邊界坐標,然後繪圖
var drawMap = function (context,data,l,t) { //context为绘制所在的层,l和t为相对位置,data为边界对象数组 if(data.been == 'yes'){ context.fillStyle = "green"; }else{ context.fillStyle = "grey"; } context.globalAlpha = 0.8; context.beginPath(); cleft = (data.coordinate[0].lng - temp_left) * bigger + l; //temp_left和temp_top为地图偏移位置. ctop = (temp_top - data.coordinate[0].lat) * bigger + t; //bigger为放大倍数 context.moveTo(cleft,ctop); for(var j = 1;j < data.coordinate.length;j++){ cleft = (data.coordinate[j].lng - temp_left) * bigger + l; ctop = (temp_top - data.coordinate[j].lat) * bigger + t; context.lineTo(cleft,ctop); } context.closePath(); context.stroke(); context.fill(); }
3.畫移動連線(連線和移動的省份畫在moveMapCanvas層)
當在地圖上拖曳省份時,出現若干條連接移動的省份和原省份的直線
var drawLinkLine = function(data,l,t){ //此处的l和t表示移动的相对位置 for(var k = 0;k < data.coordinate.length;k++){ if(k % 60 == 0){ moveMapContext.beginPath(); //根据移动距离的不同,设置连线的粗细 lineLength = Math.sqrt(l * l + t * t) / 100; lineLength = lineLength >= 4.5 ? 4.5 : lineLength; moveMapContext.lineWidth = 5 - lineLength; moveMapContext.strokeStyle = "rgba(0,120,60,0.4)"; cleft = (data.coordinate[k].lng - temp_left) * bigger; ctop = (temp_top - data.coordinate[k].lat) * bigger; moveMapContext.moveTo(cleft,ctop); cleft = (data.coordinate[k].lng - temp_left) * bigger + l; ctop = (temp_top - data.coordinate[k].lat) * bigger + t; moveMapContext.lineTo(cleft,ctop); moveMapContext.closePath(); moveMapontext.stroke(); } } }
4.事件
滑鼠按下事件:當點擊到地圖上時,要做的事是,判斷點擊位置,將位置資訊轉換成經緯度,再透過百度API根據經緯度獲得省份名稱。
$('#eventCanvas').mousedown(function(ev){ //获取点击canvas的坐标 var mouseX, mouseY; if(ev.layerX || ev.layerX==0){ mouseX = ev.layerX; mouseY = ev.layerY; }else if(ev.offsetX || ev.offsetX==0){ mouseX = ev.offsetX; mouseY = ev.offsetY; } //保存点击时的原坐标值 tempX = mouseX; tempY = mouseY; //将坐标转化为经纬度 mouseX = mouseX/bigger + temp_left; mouseY = temp_top - mouseY/bigger; if(opts.dragAll){ draging = true; }else{ moveMapContext.clearRect(0, 0, 1100, 630); //根据经纬度获得所在地理位置并获取边界坐标再画线 myGeo.getLocation(new BMap.Point(mouseX, mouseY), function(result){ tempName = ''; draging = true; name = result.addressComponents.province; tempName = name; pubFuns.drawMoveLayerLine(0,0); }); } });
滑鼠移動事件:根據點擊的省份名,獲得數據,並即時重繪移動層的省份
$('#eventCanvas').mousemove(function(ev){ var mouseX, mouseY; if(ev.layerX || ev.layerX==0){ mouseX = ev.layerX; mouseY = ev.layerY; }else if(ev.offsetX || ev.offsetX==0){ mouseX = ev.offsetX; mouseY = ev.offsetY; } if(draging){ if(opts.dragAll){ <span style="font-family: Arial, Helvetica, sans-serif;">//拖动整个地图,存在问题,地图画的太慢</span> mapContext.clearRect(0, 0, 1100, 630); for(var i = 0;i < allZoneData.length;i++){ for(var j = 0;j < allData[allZoneData[i].name].length;j++){ //allData是第一次读取数据时放到内存里的变量,它包含了所有数据 pubFuns.drawMap(mapContext,allData[allZoneData[i].name][j],mouseX - tempX, mouseY - tempY); } } }else{ moveMapContext.clearRect(0, 0, 1100, 630); pubFuns.drawMoveLayerLine(mouseX - tempX, mouseY - tempY); } } });
滑鼠抬起事件:設定dragging為false,clear移動層。
$('#eventCanvas').mouseup(function(e){ if(opts.dragAll){ }else{ moveMapContext.clearRect(0, 0, 1100, 630); } draging = false; });
小結:功能、原理都很簡單,但能熟悉canvas的一些屬性和方法。 canvas層是可以重疊在一起的,這樣就可以在不同的層畫不同的內容,方便維護和管理。
以上就是本文的全部內容,希望對大家的學習有所幫助。

html5的div元素默认一行不可以放两个。div是一个块级元素,一个元素会独占一行,两个div默认无法在同一行显示;但可以通过给div元素添加“display:inline;”样式,将其转为行内元素,就可以实现多个div在同一行显示了。

html5中列表和表格的区别:1、表格主要是用于显示数据的,而列表主要是用于给数据进行布局;2、表格是使用table标签配合tr、td、th等标签进行定义的,列表是利用li标签配合ol、ul等标签进行定义的。

固定方法:1、使用header标签定义文档头部内容,并添加“position:fixed;top:0;”样式让其固定不动;2、使用footer标签定义尾部内容,并添加“position: fixed;bottom: 0;”样式让其固定不动。

html5中不支持的标签有:1、acronym,用于定义首字母缩写,可用abbr替代;2、basefont,可利用css样式替代;3、applet,可用object替代;4、dir,定义目录列表,可用ul替代;5、big,定义大号文本等等。

HTML5中画布标签是“<canvas>”。canvas标签用于图形的绘制,它只是一个矩形的图形容器,绘制图形必须通过脚本(通常是JavaScript)来完成;开发者可利用多种js方法来在canvas中绘制路径、盒、圆、字符以及添加图像等。

html5废弃了dir列表标签。dir标签被用来定义目录列表,一般和li标签配合使用,在dir标签对中通过li标签来设置列表项,语法“<dir><li>列表项值</li>...</dir>”。HTML5已经不支持dir,可使用ul标签取代。

3种取消方法:1、给td元素添加“border:none”无边框样式即可,语法“td{border:none}”。2、给td元素添加“border:0”样式,语法“td{border:0;}”,将td边框的宽度设置为0即可。3、给td元素添加“border:transparent”样式,语法“td{border:transparent;}”,将td边框的颜色设置为透明即可。

因为html5不基于SGML(标准通用置标语言),不需要对DTD进行引用,但是需要doctype来规范浏览器的行为,也即按照正常的方式来运行,因此html5只需要写doctype即可。“!DOCTYPE”是一种标准通用标记语言的文档类型声明,用于告诉浏览器编写页面所用的标记的版本。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版
SublimeText3 Linux最新版

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),