一、空间数据
(一)定义:空间数据与统计数据 Spatial data consists of geographic entities
(二)分类:栅格数据模型与矢量数据模型是地理信息系统中空间数据组织的两种最基本的方式。
1. 栅栏数据(Vector Data):地图作为连续的平面,将其划成规则分布的格子,赋予每个格子不同的值,卫星地图、城市蔓延等常用。
2. 矢量数据(Vector Data):点、线、面,建立坐标轴进行表示,格式:shapefile/geojson/DLG等。
二、空间数据可视化——模式探索
(一)相关性
沃尔多·托布勒地理学第一定律—— All things related, but nearly things are more related than distant things.
1. 正的空间自相关,邻居跟自己的颜色一样
2. 类似于随机抽样,没有空间依赖性(自相关性)
3. 负的空间自相关,周边邻居颜色都不一样
(二)Python地图可视化——相关库:Folium库
import folium
m = folium.Map(location=[31.232818,121.475183], zoom_start=12)
# lacation为中心点定位,zoom_start为地图比例尺大小
m
m = folium.Map(
location=[31.232818,121.475183],
zoom_start=12,
tiles = 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',
attr = 'default'
)
m
folium.Marker(
location = [31.143207,121.423575],
popup = "华东理工大学",
icon = folium.Icon(color="red", icon="info-sign"),
).add_to(m)
m
案例:高德交通拥堵的可视化数据探索性分析
(一)案例说明:使用高德交通大数据某城市的实时拥堵指数来发现模式
(二)基本步骤
• 抓取某城市的拥堵数据以及地理信息
• 组织地理信息构建geojson以及GeoDataFrame
• 绘制可视化地图
步骤一:爬取某城市的交通拥堵数据以及地理信息
※ 使用requests库
import requests
header = {"User-Agent" : "Mozilla/5.0 (Windows; u; Windows NT 5.1; zh-CN; rv:1.9.1.6)",
"Accept" : "text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8",
"Accept-Language" : "en-us",
"Connection" : "keep-alive",
"Accept-Charset" : "GB2312, utf-8; q=0.7, *;q=0.7"}
# city code map
cities_info = requests.get("https://report.amap.com/ajax/getCityInfo.do?", headers = header).json()
city_code_dict = {item["name"]: item["code"] for item in cities_info}
city_code_dict #形成字典,给出城市名称即返回城市代码
# set up city name
city = "上海"
# 网页:https://report.amap.com/detail.do?city=310000
# to scrape district info
city_content = requests.get('https://report.amap.com/ajax/districtRank.do?linksType=4&cityCode={}'.format(city_code_dict[city]), headers = header).json()
步骤二:组织地理信息构建geojson以及GeoDataFrame
※ 构建geojson(参考http://datav.aliyun.com/tools/atlas/index.html)
※ 构建GeoDataFrame使用geopandas库
# construt geojson 把爬取到的数据填进去
json_data = {'type' : 'FeatureCollection', 'features':[]}
for item in city_content:
record = dict()
coords = item["coords"][0][0]
del item["coords"]
record["type"] = "Feature"
record["properties"] = item
coordinates = [[[unit["lon"], unit["lat"]] for unit in coords]]
record["geometry"] = {"type": "Polygon", "coordinates": coordinates}
json_data["features"].append(record)
json_data #直接读很难读,很大
# to check district in amap
m = folium.Map(
location = [31.143207,121.423575],
tiles = 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',
attr = "default"
)
folium.GeoJson(json_data).add_to(m)
m
import geopandas
geo_data = geopandas.GeoDataFrame.from_features(json_data["features"])
geo_data.crs = "FPSG:4326"
步骤三:绘制可视化地图——
※ 使用folium Choropleth()函数
m = folium.Map(
location = [31.143207, 121.423575],
tiles = 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',
attr = "default"
)
folium.Choropleth(
geo_data = geo_data,
name = 'Choropleth',
data = geo_data,
columns = ["id", "index"],
key_on = 'feature.properties.id',
fill_color = 'YlGn',
fill_opacity = 0.7, # 透明度
line_opacity = 0.2,
legend_name = 'index'
).add_to(m)
folium.LayerControl().add_to(m)
m
三、空间数据拓扑表达——空间权重矩阵
空间数据的建模,依赖于对数据的空间信息表达,即它们的空间拓扑关系。
一般而言,空间统计分析和计量分析中,用空间权重矩阵来表示节点、区域、个体间的拓扑结构。
自Moran(1948)以来,空间相互作用常用“权重矩阵(W)”来表达。
权重矩阵中位置 的元素 表示空间单位i与j的“接近性”,对角线均为0。
如果≠0,空间单位i被认为是j的邻居;否则,就不是。
若,那么权重矩阵就被称为行正规化。
邻接性分类
四、空间自相关检验
类似于时间自相关性,空间数据也常常会违反独立性的假定,存在空间自相关性。衡量空间自相关常用Moran's l的全局和局部估计量。
全局Moran's l的公式可以写为
Moran's l与空间模式的相关关系如下图反映,moran's l的值越远离0,则越呈现出空间模式。
更详细地,可以通过moran图来反映可视化地图与统计量之间的对应关系,从而理解如何通过可视化地图来识别空间模式。
案例:城市拥堵的空间自相关检验
(一)案例使用libpysal和esda库
(二)基本步骤
• 创建空间权重矩阵
• 进行空间自相关检验
步骤一:创建空间权重矩阵
import random
from libpysal.weights import W, Queen, Rook, KNN
# create spatial weight matrix
w_rook = Rook.from_dataframe(geo_data)
w_knn = KNN.from_dataframe(geo_data, k=3)
# Warn:崇明岛没有邻居
# 查看
w_rook.full()
# 进行正规化
w_rook.transform = 'r' # 行阵规划
w_rook.full()
# to check
district_dict = dict(zip(geo_data.index, geo_data["name"]))
neighbors = dict()
for key in w_rook.neighbors:
neighbors[district_dict.get(key)] = [district_dict[item] for item in w_rook.neighbors[key]]
neighbors
步骤二:空间自相关性检验
from esda.moran import Moran
moran = Moran(geo_data["index"], w_rook)
%matplotlib inline
import matplotlib.pyplot as plt
from splot.esda import plot_moran
plot_moran(moran, zstandard=True, figsize=(10,4))
plt.show
print(f"Moran'I的统计值为{moran.I:.4f}, 其p值为{moran.p_sim}。")
moran_knn = Moran(geo_data["index"], w_knn, transformation="r")
print(f"Moran'I的统计值为{moran_knn.I:.4f}, 其p值为{moran_knn.p_sim}。")
p值为0.01,拒绝原假设,具有空间自相关性。
五、总结与展望
(一)空间数据拓展——时空数据
(二)空间模式识别——依赖性和异质性
(三)空间建模