Django調(diào)用百度地圖api在地圖上批量增加標記點

在調(diào)用百度地圖api進行web開發(fā)時遇到了一個需求班缰,我們需要在網(wǎng)頁中內(nèi)嵌一個div 然后在div中調(diào)用百度地圖的js顯示我們所需要的地區(qū)亿遂。根據(jù)需求坐標在地圖上添加若干個標記點,并批量的為各個標記點設(shè)置監(jiān)聽函數(shù)港华,使之顯示我們所需要的信息

開始

創(chuàng)建工程

首先挑童,創(chuàng)建一個測試用的工程來測試我們的需要,可以使用pycharm或者django自帶的命令創(chuàng)建工程

django-admin startproject addressdemo

創(chuàng)建app

  • 創(chuàng)建工程之后,cd到工程目錄蚤吹,創(chuàng)建一個名為addresstest的應(yīng)用
python manage.py startapp addresstest

創(chuàng)建一個名為templates文件例诀,在其中創(chuàng)建一個address.html的測試用頁面

  • 在address.html中我們需要先為地圖創(chuàng)建一個容器 在這里我們使用一個確定好的div病設(shè)置id為allmap
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
    <style type="text/css">
        body, html {
            width: 100%;
            height: 100%;
            margin: 0;
            font-family: "微軟雅黑";
        }

        #allmap {
            height: 700px;
            width: 100%;
        }

        #r-result {
            width: 100%;
            font-size: 14px;
        }
    </style>
    
    <title>經(jīng)緯度定位</title>
</head>
<body>
<div id="allmap"></div>
<div id="r-result">

    <input type="button" />
</div>
</body>
</html>
  • 同時我們也設(shè)置了一個button為了更好的測試我們寫的引用的函數(shù)

注冊百度開發(fā)者賬號獲取秘鑰

  • 訪問<a >百度地圖開放平臺</a>注冊賬號并獲取秘鑰
    獲得秘鑰的頁面應(yīng)該如下:


    注冊獲取百度地圖開發(fā)者賬號

在address.html添加上引入百度api的js代碼

<script type="text/javascript"
        src="http://api.map.baidu.com/api?v=2.0&ak=你的秘鑰"></script>

連接mysql數(shù)據(jù)庫

  • settings.py中修改數(shù)據(jù)庫連接語句
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'addressdemo',
        'USER': 'root',
        'PASSWORD': '000000',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

設(shè)置模型類

  • 在創(chuàng)建的app下的models.py中添加如下語句
class address_info(models.Model):
    longitude = models.FloatField()
    latitude = models.FloatField()
    data = models.CharField(max_length=200)

注:

  • longitude為經(jīng)度
  • latitude為維度
  • data為標記被點擊所觸發(fā)的顯示的內(nèi)容

執(zhí)行同步數(shù)據(jù)庫操作

python manage.py makemigrations
python manage.py migrate
  • django 1.7之后版本適用

查看數(shù)據(jù)庫并在其中addresstest_address_info表中插入測試數(shù)據(jù)

  • 如圖為我插入的幾條測試數(shù)據(jù)


    數(shù)據(jù)庫插入測試數(shù)據(jù)

在view和urls中配置視圖函數(shù)和URL

修改views

  • 修改完成后的address/views.py
from django.shortcuts import render
import json
from addresstest.models import address_info


def test(request):
    address_point = address_info.objects.all()
    address_longitude = []
    address_latitude = []
    address_data = []
    for i in range(len(address_point)):
        address_longitude.append(address_point[i].longitude)
        address_latitude.append(address_point[i].latitude)
        address_data.append(address_point[i].data)

    return render(request, 'address.html',
                  {'address_longitude': json.dumps(address_longitude),
                   'address_latitude': json.dumps(address_latitude), 'address_data': json.dumps(address_data)})

  • 由于需要在前段頁面中的js代碼區(qū)域中使用,我們需要將列表json序列化然后通過頁面渲染 或者 前段請求后端返回response攜帶接送數(shù)據(jù)
  • 起初本想直接將address_point這個數(shù)據(jù)集直接傳到前段,在由前段使用模板裁着,沒有時間類型也不知道為什么會序列化出錯繁涂,如果有知道的可以反饋給我

注:

  • address_longitude為若干個坐標的經(jīng)度
  • address_latitude為若干個坐標的維度
  • address_data為標記上所需要顯示的數(shù)據(jù)
修改urls
  • 由于只用來測試,所以我們只需要在工程名下的urls寫設(shè)置一下即可
 from django.conf.urls import url
 from django.contrib import admin
 from addresstest import views
 
 urlpatterns = [
     url(r'^admin/', admin.site.urls),
     url(r'^address/',views.test),
 ]

在address.html添加設(shè)置地圖的js

  • 因為js語句塊放在頁面哪里都可以被執(zhí)行二驰,所以大家可以按照自己的喜好放置扔罪,在這里我選擇放在頁面的最后
  <script type="text/javascript">
      var map = new BMap.Map("allmap");
      map.centerAndZoom(new BMap.Point(118.3088230000, 32.3002390000), 18);
      map.enableScrollWheelZoom(true);
      var navigationControl = new BMap.NavigationControl({
          // 靠左上角位置
          anchor: BMAP_ANCHOR_TOP_LEFT,
          // LARGE類型
          type: BMAP_NAVIGATION_CONTROL_LARGE,
          // 啟用顯示定位
          enableGeolocation: true
      });
      map.addControl(navigationControl);
  
      function get_location() {
  
          var address_latitude ={{ address_latitude |safe}};
          var address_longitude ={{ address_longitude|safe }};
          var address_data ={{ address_data |safe}};
  
  
          var point = []; //存放標注點經(jīng)緯信息的數(shù)組
          var marker = []; //存放標注點對象的數(shù)組
          for (var i = 0; i < address_longitude.length; i++) {
              point[i] = new BMap.Point(address_longitude[i], address_latitude[i]); //循環(huán)生成新的地圖點
              marker[i] = new BMap.Marker(point[i]); //按照地圖點坐標生成標記
              map.addOverlay(marker[i]);
          }
  
          for (i = 0; i < marker.length; i++) {
              (function () {
                  var index = i;
                  marker[index].addEventListener('click', function () {
                      this.openInfoWindow(new BMap.InfoWindow(address_data[index]));
                  });
              })();
          }
  
      }
  </script>
  • 由于marker在添加監(jiān)聽事件時調(diào)用外部函數(shù)添加參數(shù)無效但是我們這里又需要傳遞從數(shù)據(jù)庫讀出來的需要顯示的信息,所以我們這里使用了js的閉包的概念桶雀,還使用了匿名函數(shù)矿酵,直接寫在監(jiān)聽事件函數(shù)內(nèi)
  • 完整的address.html代碼如下
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
    <style type="text/css">
        body, html {
            width: 100%;
            height: 100%;
            margin: 0;
            font-family: "微軟雅黑";
        }

        #allmap {
            height: 700px;
            width: 100%;
        }

        #r-result {
            width: 100%;
            font-size: 14px;
        }
    </style>
    <script type="text/javascript"
            src="http://api.map.baidu.com/api?v=2.0&ak=你的秘鑰"></script>
    <title>經(jīng)緯度定位</title>
</head>
<body>
<div id="allmap"></div>
<div id="r-result">

    <input type="button" value="獲取我的位置" onclick="get_location()"/>
</div>
</body>
</html>
<script type="text/javascript">
    // 百度地圖API功能
  
    var map = new BMap.Map("allmap");
    map.centerAndZoom(new BMap.Point(118.3088230000, 32.3002390000), 18);
    map.enableScrollWheelZoom(true);
    var navigationControl = new BMap.NavigationControl({
        // 靠左上角位置
        anchor: BMAP_ANCHOR_TOP_LEFT,
        // LARGE類型
        type: BMAP_NAVIGATION_CONTROL_LARGE,
        // 啟用顯示定位
        enableGeolocation: true
    });
    map.addControl(navigationControl);

    function get_location() {

        var address_latitude ={{ address_latitude |safe}};
        var address_longitude ={{ address_longitude|safe }};
        var address_data ={{ address_data |safe}};


        var point = []; //存放標注點經(jīng)緯信息的數(shù)組
        var marker = []; //存放標注點對象的數(shù)組
        for (var i = 0; i < address_longitude.length; i++) {
            point[i] = new BMap.Point(address_longitude[i], address_latitude[i]); //循環(huán)生成新的地圖點
            marker[i] = new BMap.Marker(point[i]); //按照地圖點坐標生成標記
            map.addOverlay(marker[i]);
        }

        for (i = 0; i < marker.length; i++) {
            (function () {
                var index = i;
                marker[index].addEventListener('click', function () {
                    this.openInfoWindow(new BMap.InfoWindow(address_data[index]));
                });
            })();
        }
    }

</script>

運行測試服務(wù)器查看效果

  python manage.py runserver
  • 在瀏覽器地址欄輸入http://127.0.0.1:8000/address
  • 點擊按鈕獲取我的位置


    批量地址標記顯示結(jié)果

    如上圖顯示即為成功。

注:

  • 上述代碼在django1.9Python2.7.12ubuntu16.04 lts中編譯成功運行矗积,其他環(huán)境請自行測試
  • 上述文字皆為個人看法全肮,如有錯誤或建議請及時聯(lián)系我
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棘捣,隨后出現(xiàn)的幾起案子辜腺,更是在濱河造成了極大的恐慌,老刑警劉巖乍恐,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件评疗,死亡現(xiàn)場離奇詭異,居然都是意外死亡茵烈,警方通過查閱死者的電腦和手機百匆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呜投,“玉大人胧华,你說我怎么就攤上這事≈姹耄” “怎么了矩动?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長释漆。 經(jīng)常有香客問我悲没,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任示姿,我火速辦了婚禮甜橱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栈戳。我一直安慰自己岂傲,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布子檀。 她就那樣靜靜地躺著镊掖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褂痰。 梳的紋絲不亂的頭發(fā)上亩进,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音缩歪,去河邊找鬼归薛。 笑死,一個胖子當著我的面吹牛匪蝙,可吹牛的內(nèi)容都是我干的主籍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼逛球,長吁一口氣:“原來是場噩夢啊……” “哼崇猫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起需忿,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤诅炉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后屋厘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涕烧,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年汗洒,在試婚紗的時候發(fā)現(xiàn)自己被綠了议纯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡溢谤,死狀恐怖瞻凤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情世杀,我是刑警寧澤阀参,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站瞻坝,受9級特大地震影響蛛壳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一衙荐、第九天 我趴在偏房一處隱蔽的房頂上張望捞挥。 院中可真熱鬧,春花似錦忧吟、人聲如沸砌函。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讹俊。三九已至,卻和暖如春斩祭,著一層夾襖步出監(jiān)牢的瞬間劣像,已是汗流浹背乡话。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工摧玫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绑青。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓诬像,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闸婴。 傳聞我的和親對象是個殘疾皇子坏挠,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)邪乍,斷路器降狠,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件庇楞、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評論 4 62
  • 青青河邊草…………榜配,這首歌是我童年時期記憶最深刻的一首,同學(xué)們會經(jīng)常對著我唱這首歌吕晌,因為我的名字叫青青蛋褥。 ...
    Ziyi325閱讀 273評論 0 1
  • 共享單車是當下都市最流行的交通模式,來到南京睛驳,隨處可見的單車讓我的好奇心再度膨脹烙心,拿起手機掃碼注冊,瞬間加入了共享...
    林九兒閱讀 575評論 3 5
  • 一波一橋一倩影乏沸, 一風(fēng)一浪一蘆蕩淫茵。 一眺一望一美景, 一草一木一心傷蹬跃。
    風(fēng)箏_5c59閱讀 339評論 20 25