1. 程式人生 > >匹配百度地圖API座標

匹配百度地圖API座標

在上一步得到了所有期待專案的地理座標之後,可以把資料體現在地圖上給領導看了。首先需要一張符合自己審美風格的底圖來給領導留下強烈的印象;因為我對百度地圖的初始配色非常不滿,所以這個對我來說是剛需,恰好又需要用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>

最終效果: 這裡寫圖片描述 可以看見鏈家的片區分類確實是不錯的····