度地圖開放平臺功能強大,使用簡單,為地圖的自定義提供了非常方便的途徑!
本文以繪制一張全國機器輻射圖為例記錄其基本使用方法,效果如下圖:
圖中包括了帶圖標和文本的標注,連線以及圖例。
1.關于坐標
說到地圖,不得不說坐標。
我以為,GPS獲取經緯度之后,把經緯度丟給地圖就可以了。但那真的是自以為。
1.1 坐標系
來看看實際情況,以下是百度開發文檔里的描述:
目前國內主要有以下三種坐標系:
WGS84:為一種大地坐標系,也是目前廣泛使用的GPS全球衛星定位系統使用的坐標系。
GCJ02:又稱火星坐標系,是由中國國家測繪局制訂的地理信息系統的坐標系統。由WGS84坐標系經加密后的坐標系。
BD09:為百度坐標系,在GCJ02坐標系基礎上再次加密。其中bd09ll表示百度經緯度坐標,bd09mc表示百度墨卡托米制坐標。
非中國地區地圖,服務坐標統一使用WGS84坐標。
百度對外接口的坐標系為BD09坐標系,并不是GPS采集的真實經緯度,在使用百度地圖JavaScript API服務前,需先將非百度坐標通過坐標轉換接口轉換成百度坐標。
通過 GPS 獲取的為 WGS84,在百度地圖上使用前要轉換為 BD09,百度提供了相應的 api 進行坐標轉換,文檔地址:http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924&from=1&to=5&ak=s1eeiQEfDF0WZfdfvLgHbG2Ru49UNCrn 返回結果: { status : 0, result : [ { x : 114.23074871003, y : 29.579084787993 } ] }
具體還可參考下這篇文章:https://www.cnblogs.com/yesicoo/p/4668642.html
1.2 坐標拾取器
如果坐標是靜態的,或測試用,可以直接通過百度地圖提供的“坐標拾取器”工具來獲取經緯度。
工具地址:http://api.map.baidu.com/lbsapi/getpoint/index.html
點哪就獲取哪的坐標,此坐標不用再轉換,復制過來即可以使用。
2. 開始應用
2.1 準備圖標
有好些站點可以下載圖標,如:https://easyicon.net,可以獲取一些圖標文件。至于商用的要求則要看看站點說明。
如下圖,這里準備總部與機器的圖標下載保存為 head.png、machine.png。
2.2 開啟百度地圖
地圖API的使用需要先申請一個 ak,為了體驗方便,這里已經申請了一個可以直接使用的 key,在頁面中可直接加入以下引用。
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=s1eeiQEfDF0WZfdfvLgHbG2Ru49UNCrn"></script>
使用以下語句,定義全局的地圖對象
// 百度地圖 API 功能對象 var map=null; if (BMap) { map=new BMap.Map("allmap"); // id=allmap 的容器內顯示 map.enableScrollWheelZoom(); }
2.2 標注:圖標與文本
標注使用 BMap.Marker,可以為其指定 Icon與Label。為了方便后續使用,本例定義以下函數,指定位置、圖標(本例中可用已經下載的圖標 head,machine)以及文本即可。
/** * 指定經緯度,圖標,標注文本 * 在地圖上添加標注 * longitude 經度 * latitude 緯度 * icon 圖標 * text 標注文本 **/ function addMarker(longitude, latitude, icon, text) { if (!map) return; var point=new BMap.Point(longitude, latitude); var myIcon=new BMap.Icon(icon + ".png", new BMap.Size(32, 32)); // 指定位置及標注的圖標 var marker=new BMap.Marker(point, { icon: myIcon }); // 創建標注 if(text){ var label=new BMap.Label(text, { offset: new BMap.Size(32, -16) }); marker.setLabel(label); } // 添加到地圖上 map.addOverlay(marker); }
2.3 連線
連線實際使用的是繪制多邊形的功能,只是當只指定了兩個點時,就是一根線。同樣,這里定義一個函數以方便直接調用。
/** * 指定起止經緯度,繪制連接線 * * longitudeFrom 經度 * latitudeFrom 緯度 * longitudeTo 經度 * latitudeTo 緯度 **/ function addLine(longitudeFrom, latitudeFrom, longitudeTo, latitudeTo) { if (!map) return; var pointFrom=new BMap.Point(longitudeFrom, latitudeFrom); var pointTo=new BMap.Point(longitudeTo, latitudeTo); // 可以指定多點連接,此處只考慮兩點 var line=new BMap.Polyline([pointFrom, pointTo], { strokeWeight:1, strokeOpacity:0.5, strokeColor:"red" }); // 添加到地圖上 map.addOverlay(line); }
2.4 圖例
圖例需要以地圖定義的控件方式來添加,在控件的 initialize 事件中完成 DOM 元素的生成即可,為了體現過程本身,以下函數把 DOM 的html文本作為參數,由外部靈活定義。
/** * 添加圖例 * 實質就是在地圖上添加自己的頁面元素 * * html 網頁元素 **/ function addLegend(html){ var LegendControl=function () { this.defaultAnchor=BMAP_ANCHOR_TOP_LEFT; this.defaultOffset=new BMap.Size(10, 10); } LegendControl.prototype=new BMap.Control(); LegendControl.prototype.initialize=function (map) { var le=$(html)[0]; map.getContainer().appendChild(le); return le; }; var legendCtrl=new LegendControl(); map.addControl(legendCtrl); }
2.5 綜合
有了以上函數,綜合起來就流程清晰了。以下坐標,均通過坐標拾取器獲取。
// 機器類:經度,緯度,名稱 function Machine(longitude, latitude, name){ this.longitude=longitude; this.latitude=latitude; this.name=name; } // 確定地圖的中心位置與縮放級別 var center=new BMap.Point(110.423997,31.40979); map.centerAndZoom(center, 6); // 級別 6,跨省視圖 // 添加圖例,自由寫 html addLegend("<div style='font-size:12px; color:gray; width:140px; padding:5px; background:white; text-align:center; border:solid 1px gray;'>總部:<img src='head.png' style='width:16px; vertical-align:middle;' /> 設備:<img src='machine.png' style='width:16px; vertical-align:middle;' /></div>"); // 總部位置 var head={ longitude : 112.918702343957, latitude : 28.30070516 }; addMarker(head.longitude, head.latitude, 'head', '總部'); // 所有機器位置 var machineList=[ new Machine(114.876143,38.113315,'石家莊'), new Machine(112.521289,37.822014,'太原'), new Machine(108.989008,34.328175,'西安'), new Machine(117.230997,31.881961,'合肥'), new Machine(103.984944,30.553819,'成都'), new Machine(108.400295,22.862517,'南寧'), new Machine(113.257181,23.169067,'廣州'), new Machine(120.174565,30.298715,'杭州'), new Machine(102.881106,24.959705,'昆明') ]; // 添加所有機器并連線 for(var i=0; i<machineList.length; i++){ addMarker(machineList[i].longitude, machineList[i].latitude, 'machine', machineList[i].name); addLine(head.longitude, head.latitude, machineList[i].longitude, machineList[i].latitude); }
3. 結語
本文完整代碼可從此處下載:
https://github.com/triplestudio/helloworld/blob/master/baidu_map_demo.html
在此基礎上,可以根據需要進一步擴展功能,具體參考百度地圖開放平臺開發文檔:
http://lbsyun.baidu.com/
讀本文大約需要3分鐘
主要內容:數據分析。
適用人群:Python初學者,數據分析師,或有志從事數據分析工作的人員。
準備軟件:Anaconda(Spyder:代碼編譯)、Navicat Premium 12(數據庫)。
從事IT項目管理這么多年,基本上已經遺棄編程技能,但從2019年開始接觸Python,深深地迷上了這門語言,像硬件集成、數據分析,我都會用python來寫。曉風想通過本文,讓初學者們學會以下內容:
1、Pyecharts圖表;
2、連接數據庫;
3、大屏看板-監控中心。
今天,我們詳細地介紹1、Pyecharts圖表,保證大家能夠舉一反三。
我們還可以用Matplotlib,Seaborn等進行數據分析,但今天曉風主要介紹Pyecharts(夠用),以下兩個地址大家可以收藏下(有用)。
Pyecharts的鏈接:https://pyecharts.org/#/zh-cn/
Pyecharts的圖示:https://gallery.pyecharts.org/#/README
Pyecharts主要有以下幾種圖表:
1、地圖
2、儀表盤
3、柱狀圖
4、折線圖
5、餅圖
6、表格
7、水球圖
8、箱型圖
9、日歷圖
10、漏斗圖
11、關系圖
12、桑基圖
13、散點圖
14、詞云圖
特意列了這些圖表,是為了告訴大家,這些圖表比較普遍,并且在Pyecharts都有現成代碼可以復制,那么接下來,曉風以柱狀圖為例,大家可以舉一反三來繪制其他圖表。
1、打開Pyecharts的柱狀圖圖示鏈接:https://gallery.pyecharts.org/#/Bar/bar_base
2、打開Anaconda - Spyder - 新建一個文件,將以下代碼復制到spyder,
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker
c=(
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副標題"))
.render("bar_base.html")
)
初次引用庫,需要先到Anaconda - Environments安裝,比如安裝pyecharts庫:
3、保存-運行程序,保存文件到自己指定的文件夾下
4、要查看柱狀圖效果,可能要去自己保存的文件夾下找到“bar_base.html”,打開查看效果
5、需要修改柱狀圖的內容,我們先了解下圖表的各區域表示
我們需要修改哪部分,比如想要修改標題,標題的配置項是LegendOpts: 圖例配置項
打開pyecharts的鏈接:https://pyecharts.org/#/zh-cn/
找到配置項 - 全局配置項 - LegendOpts: 圖例配置項
class LegendOpts(
# 圖例的類型。可選值:
# 'plain':普通圖例。缺省就是普通圖例。
# 'scroll':可滾動翻頁的圖例。當圖例數量較多時可以使用。
type_: Optional[str]=None,
# 圖例選擇的模式,控制是否可以通過點擊圖例改變系列的顯示狀態。默認開啟圖例選擇,可以設成 false 關閉
# 除此之外也可以設成 'single' 或者 'multiple' 使用單選或者多選模式。
selected_mode: Union[str, bool, None]=None,
# 是否顯示圖例組件
is_show: bool=True,
# 圖例組件離容器左側的距離。
# left 的值可以是像 20 這樣的具體像素值,可以是像 '20%' 這樣相對于容器高寬的百分比,
# 也可以是 'left', 'center', 'right'。
# 如果 left 的值為'left', 'center', 'right',組件會根據相應的位置自動對齊。
pos_left: Union[str, Numeric, None]=None,
# 圖例組件離容器右側的距離。
# right 的值可以是像 20 這樣的具體像素值,可以是像 '20%' 這樣相對于容器高寬的百分比。
pos_right: Union[str, Numeric, None]=None,
# 圖例組件離容器上側的距離。
# top 的值可以是像 20 這樣的具體像素值,可以是像 '20%' 這樣相對于容器高寬的百分比,
# 也可以是 'top', 'middle', 'bottom'。
# 如果 top 的值為'top', 'middle', 'bottom',組件會根據相應的位置自動對齊。
pos_top: Union[str, Numeric, None]=None,
# 圖例組件離容器下側的距離。
# bottom 的值可以是像 20 這樣的具體像素值,可以是像 '20%' 這樣相對于容器高寬的百分比。
pos_bottom: Union[str, Numeric, None]=None,
# 圖例列表的布局朝向。可選:'horizontal', 'vertical'
orient: Optional[str]=None,
# 圖例標記和文本的對齊。默認自動(auto)
# 根據組件的位置和 orient 決定
# 當組件的 left 值為 'right' 以及縱向布局(orient 為 'vertical')的時候為右對齊,即為 'right'。
# 可選參數: `auto`, `left`, `right`
align: Optional[str]=None,
# 圖例內邊距,單位px,默認各方向內邊距為5
padding: int=5,
# 圖例每項之間的間隔。橫向布局時為水平間隔,縱向布局時為縱向間隔。
# 默認間隔為 10
item_gap: int=10,
# 圖例標記的圖形寬度。默認寬度為 25
item_width: int=25,
# 圖例標記的圖形高度。默認高度為 14
item_height: int=14,
# 圖例關閉時的顏色。默認是 #ccc
inactive_color: Optional[str]=None,
# 圖例組件字體樣式,參考 `series_options.TextStyleOpts`
textstyle_opts: Union[TextStyleOpts, dict, None]=None,
# 圖例項的 icon。
# ECharts 提供的標記類型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none'
# 可以通過 'image://url' 設置為圖片,其中 URL 為圖片的鏈接,或者 dataURI。
# 可以通過 'path://' 將圖標設置為任意的矢量路徑。
legend_icon: Optional[str]=None,
)
比如我不想顯示這個圖例,那么is_show=False,顯示位置左對齊,那么pos_left="left"。應該修改代碼如下:
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker
c=(
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副標題"),
legend_opts=opts.LegendOpts(is_show=False)
)
.render("bar_base.html")
)
學習到了這里,我們就可以舉一反三,所有圖表的編寫方法是一致的。好了,大家趕緊動起來,有空就把所有圖表都操作一遍。今天的內容就到這里,接下來會教大家怎么連接數據庫,將動態的數據呈現出來,敬請期待。愿我們一起成長!
如果覺得有用的話,請幫忙點贊、關注、收藏哦,感謝您的支持!
例
Norwegian Mountain Trip
在線實例
插入圖像
本例演示如何在網頁中顯示圖像。
從不同的位置插入圖片
本例演示如何將其他文件夾或服務器的圖片顯示到網頁中。
(可以在本頁底端找到更多實例。)
HTML 圖像- 圖像標簽( <img>)和源屬性(Src)
在 HTML 中,圖像由<img> 標簽定義。
<img> 是空標簽,意思是說,它只包含屬性,并且沒有閉合標簽。
要在頁面上顯示圖像,你需要使用源屬性(src)。src 指 "source"。源屬性的值是圖像的 URL 地址。
定義圖像的語法是:
<img src="url" alt="some_text">
URL 指存儲圖像的位置。如果名為 "boat.gif" 的圖像位于 www.w3school.com.cn 的 images 目錄中,那么其 URL 為 http://www.w3school.com.cn/images/boat.gif。
瀏覽器將圖像顯示在文檔中圖像標簽出現的地方。如果你將圖像標簽置于兩個段落之間,那么瀏覽器會首先顯示第一個段落,然后顯示圖片,最后顯示第二段。
HTML 圖像- Alt屬性
alt 屬性用來為圖像定義一串預備的可替換的文本。
替換文本屬性的值是用戶定義的。
<img src="boat.gif" alt="Big Boat">
在瀏覽器無法載入圖像時,替換文本屬性告訴讀者她們失去的信息。此時,瀏覽器將顯示這個替代性的文本而不是圖像。為頁面上的圖像都加上替換文本屬性是個好習慣,這樣有助于更好的顯示信息,并且對于那些使用純文本瀏覽器的人來說是非常有用的。
HTML 圖像- 設置圖像的高度與寬度
height(高度) 與 width(寬度)屬性用于設置圖像的高度與寬度。
屬性值默認單位為像素:
<img src="pulpit.jpg" alt="Pulpit rock" width="304" height="228">
提示: 指定圖像的高度和寬度的一個很好的習慣。如果圖像指定了高度寬度,頁面加載時就會保留指定的尺寸。如果沒有指定圖片的大小,加載頁面時有可能會破壞HTML頁面的整體布局。
基本的注意事項 - 有用的提示:
注意: 假如某個 HTML 文件包含十個圖像,那么為了正確顯示這個頁面,需要加載 11 個文件。加載圖片是需要時間的,所以我們的建議是:慎用圖片。
注意: 加載頁面時,要注意插入頁面圖像的路徑,如果不能正確設置圖像的位置,瀏覽器無法加載圖片,圖像標簽就會顯示一個破碎的圖片。
更多實例
排列圖片
本例演示如何在文字中排列圖像。
浮動圖像
本例演示如何使圖片浮動至段落的左邊或右邊。
設置圖像鏈接
本例演示如何將圖像作為一個鏈接使用。
創建圖像映射
本例顯示如何創建帶有可供點擊區域的圖像地圖。其中的每個區域都是一個超級鏈接。
HTML 圖像標簽
標簽 | 描述 |
---|---|
<img> | 定義圖像 |
<map> | 定義圖像地圖 |
<area> | 定義圖像地圖中的可點擊區域 |
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。