Geoplotlib
Geoplotlib可以用来制作多种地图,比如等值区域图, 热度图,点密度图。
必须安装 Pyglet (一个面向对象编程接口)和 Numpy 才能使用geoplotlib。
安装
在anaconda prompt命令行下输入:
pip install geoplotlib
这时我们还需要安装Pyglet,所以也输入:
pip install pyglet
如果是开发环境是Mac的话,请安装Pyglet1.24以上。Numpy 前面我们已经安装了,这里就不需要再进行安装了。
使用
我们先介绍一些常用简单图形的绘制:
点密度图
bus.csv数据:name,lat,lon,例:Rådhuspassagen,55.7439334696163,12.4939206032287
import geoplotlib
from geoplotlib.utils import read_csv
data = read_csv('data/bus.csv')
geoplotlib.dot(data)
geoplotlib.show()
直方图
opencellid_dk.csv数据:lon,lat,例:11.3536345358484,55.396806865594705
import geoplotlib
from geoplotlib.utils import read_csv, BoundingBox
data = read_csv('data/opencellid_dk.csv')
geoplotlib.hist(data, colorscale='sqrt', binsize=8)
geoplotlib.set_bbox(BoundingBox.DK)
geoplotlib.show()
核密度估计
opencellid_dk.csv数据:lon,lat,例:11.3536345358484,55.396806865594705
import geoplotlib
from geoplotlib.utils import read_csv, BoundingBox
data = read_csv('data/opencellid_dk.csv')
geoplotlib.kde(data, bw=5, cut_below=1e-4)
geoplotlib.set_bbox(BoundingBox.KBH)
geoplotlib.show()
K-means
这是一个自定义图层,要继承BaseLayer这个基类,然后再重写其中的部分方法,比如,我们这次要重写invalidate(self, proj)这个方法,这个方法的作用,就是在每次geoplatlib相机高度改变,需要重绘的时候调用的。
from geoplotlib.colors import create_set_cmap
import pyglet
from sklearn.cluster import KMeans
import geoplotlib
from geoplotlib.layers import BaseLayer
from geoplotlib.core import BatchPainter
from geoplotlib.utils import BoundingBox
import numpy as np
class KMeansLayer(BaseLayer):
def __init__(self, data):
self.data = data
self.k = 4
def invalidate(self, proj):
self.painter = BatchPainter()
x, y = proj.lonlat_to_screen(self.data['lon'], self.data['lat'])
k_means = KMeans(n_clusters=self.k)
k_means.fit(np.vstack([x,y]).T)
labels = k_means.labels_
self.cmap = create_set_cmap(set(labels), 'hsv')
for l in set(labels):
self.painter.set_color(self.cmap[l])
self.painter.convexhull(x[labels == l], y[labels == l])
self.painter.points(x[labels == l], y[labels == l], 2)
def draw(self, proj, mouse_x, mouse_y, ui_manager):
ui_manager.info('Use left and right to increase/decrease the number of clusters. k = %d' % self.k)
self.painter.batch_draw()
def on_key_release(self, key, modifiers):
if key == pyglet.window.key.LEFT:
self.k = max(2,self.k - 1)
return True
elif key == pyglet.window.key.RIGHT:
self.k = self.k + 1
return True
return False
data = geoplotlib.utils.read_csv('data/bus.csv')
geoplotlib.add_layer(KMeansLayer(data))
geoplotlib.set_smoothing(True)
geoplotlib.set_bbox(geoplotlib.utils.BoundingBox.DK)
geoplotlib.show()