匹配百度地圖API座標
阿新 • • 發佈:2018-12-09
在上一步得到了所有期待專案的地理座標之後,可以把資料體現在地圖上給領導看了。首先需要一張符合自己審美風格的底圖來給領導留下強烈的印象;因為我對百度地圖的初始配色非常不滿,所以這個對我來說是剛需,恰好又需要用echarts出地圖,所以就剛好一起做了。
# echarts
# 這裡是把地圖裝在dlg_map.js檔案裡再再html中呼叫
# 以下為dly_map.js中的內容
function loadOneColumn(dataJson) {
var colors = [
'#5793f3', '#d14a61', '#675bba', '#FF8C44', '#a1ec97' ,
'#7EABF3', '#D16C7D', '#7C73BA', '#FF9A5B', '#a8e4a0',
'#9BBDF3', '#D18592', '#8C85BA', '#FFB384', '#aedba8',
'#B1CBF3', '#D198A2', '#9892BA', '#FFC6A3', '#b2d4ae',
'#bfcde3', '#c99fa6', '#9b96b4', '#F3E1D6', '#b5cfb2'
]; // 我自己常用的配色表
var myChart_map01 = echarts.init(document.getElementById('map01' ));
myChart_map01.setOption({
title: {
// show: false,
text: '熱點專案地圖(月)',
x: 'center',
textStyle: {
color: '#666666',
},
}, // 標題
tooltip : {
trigger: 'item',
formatter: '{b}{a}' ,
}, // 顯示
toolbox: {
// show: false,
orient: 'vertical',
x: 'left',
y: 'center',
feature: {
restore: {show: true},
saveAsImage: {show: true}
}
}, // 工具箱
legend: {
backgroundColor:'white',
x: 'left',
y: 'top',
data: ['瀏覽','到訪','成交','成交流出'],
selected:{
'到訪':false,
'成交':false
}
}, // 我在echarts地圖上需要展示的維度
bmap: { // 定製地圖bmap
center: [114.0667, 22.6590],
zoom: 12,
roam: true,
mapStyle:{
// 以下為調整百度地圖展示方式的部分
styleJson: [
{
'featureType': 'land', //調整土地顏色
'elementType': 'geometry',
'stylers': {
'color': '#f3f3f3'
}
},
{
'featureType': 'building', //調整建築物顏色
'elementType': 'geometry',
'stylers': {
'color': '#04406F',
'visibility': 'off'
}
},
{
'featureType': 'building', //調整建築物標籤是否可視
'elementType': 'labels',
'stylers': {
'visibility': 'off'
}
},
{
'featureType': 'highway', //調整高速道路顏色
'elementType': 'geometry',
'stylers': {
'color': '#fdfdfd'
}
},
{
'featureType': 'highway', //調整高速名字是否可視
'elementType': 'labels',
'stylers': {
'visibility': 'off'
}
},
{
'featureType': 'arterial', //調整一些幹道顏色
'elementType': 'geometry',
'stylers': {
'color':'#fefefe'
}
},
{
'featureType': 'arterial', // 幹道標籤不顯示
'elementType': 'labels',
'stylers': {
'visibility': 'off'
}
},
{
'featureType': 'green', //綠地
'elementType': 'geometry',
'stylers': {
'color': '#E6E6E6'
}
},
{
'featureType': 'water', //水體
'elementType': 'geometry',
'stylers': {
'color': '#d1d1d1'
}
},
{
'featureType': 'subway', //地鐵
'elementType': 'geometry.stroke',
'stylers': {
'color': '#fdfdfd'
}
},
{
'featureType': 'subway', //地鐵標籤不顯示
'elementType': 'labels',
'stylers': {
'visibility': 'off'
}
},
{
'featureType': 'railway', //鐵路不顯示
'elementType': 'geometry',
'stylers': {
'visibility': 'off'
}
},
{
'featureType': 'railway', //鐵路標籤不顯示
'elementType': 'labels',
'stylers': {
'visibility': 'off'
}
},
{
'featureType': 'all', //調整所有的標籤的邊緣顏色
'elementType': 'labels.text.stroke',
'stylers': {
'color': '#313131',
'visibility': 'off'
}
},
{
'featureType': 'all', //調整所有標籤的填充顏色,選擇不顯示
'elementType': 'labels.text.fill',
'stylers': {
'color': '#FFFFFF',
'visibility': 'off'
}
},
{
'featureType': 'manmade', //人工造物? = =
'elementType': 'geometry',
'stylers': {
'visibility': 'off'
}
},
{
'featureType': 'manmade',
'elementType': 'labels',
'stylers': {
'visibility': 'off'
}
},
{
'featureType': 'local',
'elementType': 'geometry',
'stylers': {
// 'visibility': 'off'
}
},
{
'featureType': 'local',
'elementType': 'labels',
'stylers': {
// 'visibility': 'off'
}
},
{
'featureType': 'subway', //地鐵色差,調亮一點契合我的白色主題
'elementType': 'geometry',
'stylers': {
'lightness': 85
}
},
{
'featureType': 'railway', //鐵路色差
'elementType': 'all',
'stylers': {
'lightness': 60
}
},
{
'featureType': 'boundary', //邊界色差
'elementType': 'geometry',
'stylers': {
'color': '#8b8787',
'weight': '1',
'lightness': 40
}
}
]
}
},
series: [
{
name: '瀏覽',
coordinateSystem: 'bmap',
type: 'scatter',
z: 0,
large: true,
// large: true,
// rippleEffect: {
// brushType: 'fill',
// scale: 2
// },
hoverAnimation: true,
itemStyle: {
normal: {
color: colors[14],
opacity: 0.6,
shadowBlur: 6,
shadowColor: '#666666'
}
},
label: {
normal: {
formatter: function(val){
return val.value[2];
},
position: 'inside',
show: false
},
emphasis: {
show: true,
color: "#1b1b1b"
}
},
symbolSize: function (val) {
return Math.sqrt(50*(val[2])/3.14);
// return Math.sqrt(10*(val[2])/3.14); //用於幫助運營出特定年度成交資料的修正顯示圖
},
data: []
},
{
name: '到訪',
coordinateSystem: 'bmap',
type: 'scatter',
z: 0,
large: true,
hoverAnimation: true,
itemStyle: {
normal: {
color: colors[10],
opacity: 0.6,
shadowBlur: 6,
shadowColor: '#666666'
}
},
label: {
normal: {
formatter: function(val){
return val.value[2];
},
position: 'inside',
show: false
},
emphasis: {
show: true,
color: "#1b1b1b"
}
},
symbolSize: function (val) {
return Math.sqrt(50*(val[2])/3.14);
},
data: [],
},
{
name: '成交',
coordinateSystem: 'bmap',
type: 'scatter',
z: 1,
large: true,
hoverAnimation: true,
itemStyle: {
normal: {
color: colors[11],
opacity: 0.6,
shadowBlur: 6,
shadowColor: '#666666'
}
},
label: {
normal: {
formatter: function(val){
return val.value[2];
},
position: 'inside',
show: false
},
emphasis: {
show: true,
color: "#ffffff"
}
},
symbolSize: function (val) {
return Math.sqrt(50*(val[2])/3.14);
},
data: [],
},
{
name: '成交流出',
coordinateSystem: 'bmap',
type: 'lines',
z: 1,
symbol: ['circle', 'emptyCircle'],
symbolSize: [2, 10],
label: {
normal: {
show: false,
formatter: '{a}: {c}'
},
emphasis: {
show: true,
color: colors[0],
shadowBlur: 5,
shadowColor: '#ffffff'
}
},
lineStyle: {
normal: {
width: 2,
opacity: 0.6,
curveness: 0.1,
color: colors[6],
}
},
data: []
}
]
});
var bmap = myChart_map01.getModel().getComponent('bmap').getBMap();
bmap.addControl(new BMap.MapTypeControl());
// 從另一個js檔案中呼叫資料的部分,此處略過不表
myChart_map01.showLoading();
var map_rd = [];
var map_vs = [];
var map_dl = [];
var map_dl_flw = [];
$.each(dataJson.list, function (index, item) {
map_rd.push(item.map_rd);
map_vs.push(item.map_vs);
map_dl.push(item.map_dl);
map_dl_flw.push(item.map_dl_flw);
});
myChart_map01.hideLoading();
myChart_map01.setOption({
series: [
{
name: '瀏覽',
data: map_rd
},
{
name: '到訪',
data: map_vs
},
{
name: '成交',
data: map_dl
},
{
name: '成交流出',
data: map_dl_flw
}
]
});
};
$(function(){})
然後是呼叫上面這個dlg_map.js檔案的html
# html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=">
<title>資料分析</title>
<style type="text/css">
... // ccs略過不表
</style>
<script src="js/echarts.min.js"></script>
<script src="js/bmap.min.js"></script>
<script src="js/jquery-3.3.1/jquery-3.3.1.min.js" type="text/javascript"></script>
</head>
<body>
<section>
<article>
<div id="map01" style="width:95%;height:680px;"></div>
<script src="http://api.map.baidu.com/api?v=2.0&ak=##########"></script> // 指定百度地圖呼叫地址和ak
<script src="js/dlg_map.js"></script> // 呼叫上面寫好的js
<script type="text/javascript" src="js/log_map.js"></script> // 呼叫另一個js中寫好的data
</article>
</section>
</body>
</html>
最後是這樣一張圖
然而其實我只是需要這個淺白風格的底圖用來放在python裡呼叫:
把我們在庫裡存好的全深圳的專案資訊,包含專案名、專案所屬片區、專案經緯度的資料準備好,按片區分色顯示在地圖上:
# python3 jupyternotebook
###### initial setup
import numpy as np
import pandas as pd
import pymongo
import time
import re
import os
os.chdir("C:/Users/sss/OneDrive/daily_Script/Script_Python/") # 專案路徑
CHAPTER_ID = "requests_re_lctn_baiduAPI" # 專案名稱
###### initial setup for plotting
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline
plt.rcParams['axes.labelsize'] = 12
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
PROJECT_ROOT_DIR = "."
IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, "doc_images", CHAPTER_ID) # Where to save the figures
def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300):
path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension)
print("Saving figure", fig_id)
if tight_layout:
plt.tight_layout()
plt.savefig(path, format=fig_extension, dpi=resolution)
def plt_map(dtf_input, tg_size, tg_colr, fig_output, tg_alpha=0.3, tg_size_scale=6):
sz_img=mpimg.imread(PROJECT_ROOT_DIR+"\\doc_images\\"+CHAPTER_ID+"\\img_sz.png")
ax = dtf_input.plot(kind="scatter", x="lng", y="lat", figsize=(15,10),
s = dtf_input[tg_size]*tg_size_scale, label = tg_size,
c = tg_colr, cmap = plt.get_cmap("jet"),
alpha = tg_alpha, colorbar = False,
)
plt.imshow(sz_img, extent=[113.80,114.5, 22.45, 22.80], alpha=0.6, cmap=plt.get_cmap("jet"))
plt.xlabel("Longitude", fontsize=10)
plt.ylabel("Latitude", fontsize=10)
prices = dtf_input[tg_colr]
tick_values = np.linspace(prices.min(), prices.max(), 11)
cbar = plt.colorbar()
cbar.ax.set_yticklabels(["(%.d)prcnt"%(v*100) for v in tick_values], fontsize=14)
cbar.set_label(tg_colr, fontsize=16)
plt.legend(fontsize=10)
save_fig(fig_output)
plt.show()
plt_map(dtf_xhbn_img, 'cnt_show', '所屬片區', 'pic_map')
# 在資料框dtf_xhbn_img中 包含'lng','lat','cnt_show','所屬片區'四列
# 用'cnt_show'變數決定大小, '所屬片區'決定顏色,儲存圖片名'pic_map'
# 畫圖在地址為為'C:/Users/sss/OneDrive/daily_Script/Script_Python/doc_images/requests_re_lctn_baiduAPI/img_sz.png'的底圖上
# 圖片儲存在同文件夾內
# python指令碼底板來自<Hands-on ML with Sklearn & TF>
最終效果: 可以看見鏈家的片區分類確實是不錯的····