Python 繪製屬於你的世界地圖

Python之因此這麼流行,是由於它不只可以應用於科技領域,還能用來作許多其餘學科的研究工具,最多見的即是繪製地圖python

今天咱們用matplot工具包之一的:mpltoolkits來繪製世界地圖,這是一個簡單的可視化地圖工具,你若是但願繪製更加複雜的地圖,能夠考慮使用Google Maps API,不過這不在咱們今天的討論範圍以內。bash

1.安裝

若是你尚未安裝Python,請見這篇文章:超詳細Python安裝指南工具

爲了可以順利開展本項目,你須要先安裝如下依賴,在cmd或Terminal中輸入如下命令:學習

pip install numpy

pip install matplotlib
複製代碼

爲了使用 mpl_toolkits, 單純安裝matplotlib是不夠的,咱們還須要單獨安裝basemap,若是你已經安裝了Anaconda,那這一步就很是好辦,輸入如下命令安裝便可:ui

conda install basemapspa

若是沒有的話,就稍微麻煩一點:code

1.安裝geos: pip install geoscdn

2.根據你的Python版本下載basemap http://www.lfd.uci.edu/~gohlke/pythonlibs/#basemap
PS: cp後面的數字是Python的版本。(在頁面上按ctrl+F,輸入basemap快速定位)blog

3.在 cmd 下進入該文件的目錄,運行教程

pip install basemap‑1.2.1‑cp37‑cp37m‑win_amd64.whl
複製代碼

2.簡單地圖

讓咱們開始繪製一個地球,中心指向中國:

# 導入須要的包
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

# 初始化圖形
plt.figure(figsize=(8, 8))
# 底圖:圓形, lat_0:緯度;lon_o: 經度, (113,29)是武漢
m = Basemap(projection='ortho', resolution=None, lat_0=29, lon_0=113)
# 底色
m.bluemarble(scale=0.5)
# 顯示
plt.show()
複製代碼

這裏的重點在於Basemap,指定好你想要放置的中心。

效果還不錯哦,不只如此,它其實不僅僅只是一張圖像,它仍是一個功能齊全的matplot畫布。這也就意味着,你可以在上面畫線!讓咱們放大地圖,進入中國區域,而後標記出深圳的位置:

# 導入須要的包
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

# 如下三行是爲了讓matplot能顯示中文
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False

fig = plt.figure(figsize=(8, 8))
# 注意幾個新增的參數, width和height是用來控制放大尺度的
# 分別表明投影的寬度和高度(8E6表明 8x10^6米)
m = Basemap(projection='lcc', resolution=None,
            width=8E6, height=8E6,
            lat_0=23, lon_0=113,)
m.bluemarble(scale=0.5)

# 這裏的經緯度是:(經度, 緯度)
x, y = m(113, 23)
plt.plot(x, y, 'ok', markersize=5) 
plt.text(x, y, '深圳', fontsize=12, color="red") 
plt.show()
複製代碼

不要用藍底圖了,看得不是很清晰,咱們換成浮雕型:

能夠很明顯地看到山區、丘陵等地理樣貌。你還能夠根據你的須要,針對某幾個城市作連線或者繪製某些經緯度之間的區域。別忘了,這但是matplotlib可編輯的畫布。

3.世界地圖

接下來,咱們將上述的世界地圖展開成帶經緯線的平面圖形。

# 導入須要的包
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from itertools import chain

def draw_map(m, scale=0.2):
    # 繪製帶陰影的浮雕圖像
    m.shadedrelief(scale=scale)

    # 根據經緯度切割,每13度一條線
    lats = m.drawparallels(np.linspace(-90, 90, 13))
    lons = m.drawmeridians(np.linspace(-180, 180, 13))

    # 集合全部線條
    lat_lines = chain(*(tup[1][0] for tup in lats.items()))
    lon_lines = chain(*(tup[1][0] for tup in lons.items()))
    all_lines = chain(lat_lines, lon_lines)

    # 循環畫線
    for line in all_lines:
        line.set(linestyle='-', alpha=0.3, color='w')

fig = plt.figure(figsize=(8, 6), edgecolor='w')
m = Basemap(projection='cyl', resolution=None,
            llcrnrlat=-90, urcrnrlat=90,
            llcrnrlon=-180, urcrnrlon=180,)

draw_map(m)
plt.show()
複製代碼

嗯,有點那個味了哈。均可以本身去打印出來給小孩子學習地理了。可是他若是想學習地理,好像整個世界有點大?咱們先讓他學習世界著名景點的位置吧?

# 導入須要的包
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from itertools import chain

# 如下三行是爲了讓matplot能顯示中文
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False

def draw_point(m, x, y, name):
    # 這裏的經緯度是:(經度, 緯度)
    x, y = m(x, y)
    plt.plot(x, y, 'ok', markersize=5)
    plt.text(x, y, name, fontsize=12, color="red")

def draw_map(m, scale=0.2):
    # 繪製帶陰影的浮雕圖像
    m.shadedrelief(scale=scale)

    # 根據經緯度切割,每13度一條線
    lats = m.drawparallels(np.linspace(-90, 90, 13))
    lons = m.drawmeridians(np.linspace(-180, 180, 13))

    # 集合全部線條
    lat_lines = chain(*(tup[1][0] for tup in lats.items()))
    lon_lines = chain(*(tup[1][0] for tup in lons.items()))
    all_lines = chain(lat_lines, lon_lines)

    # 循環畫線
    for line in all_lines:
        line.set(linestyle='-', alpha=0.3, color='w')

fig = plt.figure(figsize=(8, 6), edgecolor='w')
m = Basemap(projection='cyl', resolution=None,
            llcrnrlat=-90, urcrnrlat=90,
            llcrnrlon=-180, urcrnrlon=180,)
locations = {
    '泰姬陵': (17, 78),
    '吉薩金字塔羣': (29, 31),
    '英國的巨石陣': (51, 1),
    '巴黎聖母院': (48, 2),
    '盧浮宮': (48, 2),
    '紅場和克里姆林': (55, 37),
    # ...
}
draw_map(m)
for loc in locations:
    print(locations[loc])
    draw_point(m, locations[loc][1], locations[loc][0], loc)
plt.show()
複製代碼

這樣,你只須要往locations裏相似地加入某個地點的經緯度,就能在地圖上展現出來了,你還能自定義地畫兩個地點之間的連線,或者是重點放大某個區域,總而言之,你想幹的,基本上基於Matplotlib均可以作獲得。

咱們的文章到此就結束啦,若是你但願咱們今天的Python 教程,請持續關注咱們,若是對你有幫助,麻煩在下面點一個贊/在看哦

有任何問題均可以在下方留言區留言,咱們都會耐心解答的!


​Python實用寶典 (pythondict.com)
不僅是一個寶典
歡迎關注公衆號:Python實用寶典

原文來自Python實用寶典:Python 繪製屬於你的世界地圖

Python實用寶典
相關文章
相關標籤/搜索