基于Python的空间分布初步-学习笔记(一)

一、空间数据

(一)定义:空间数据与统计数据 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.

基于Python的空间分布初步-学习笔记(一)    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)”来表达。

基于Python的空间分布初步-学习笔记(一)

基于Python的空间分布初步-学习笔记(一)

     权重矩阵中位置基于Python的空间分布初步-学习笔记(一) 的元素基于Python的空间分布初步-学习笔记(一) 表示空间单位i与j的“接近性”,对角线均为0。

    如果基于Python的空间分布初步-学习笔记(一)≠0,空间单位i被认为是j的邻居;否则,就不是。

    若基于Python的空间分布初步-学习笔记(一),那么权重矩阵就被称为行正规化。 

 基于Python的空间分布初步-学习笔记(一)

      邻接性分类

基于Python的空间分布初步-学习笔记(一)

四、空间自相关检验

    类似于时间自相关性,空间数据也常常会违反独立性的假定,存在空间自相关性。衡量空间自相关常用Moran's l的全局和局部估计量。

    全局Moran's l的公式可以写为

基于Python的空间分布初步-学习笔记(一)

    Moran's l与空间模式的相关关系如下图反映,moran's l的值越远离0,则越呈现出空间模式。

基于Python的空间分布初步-学习笔记(一)

    更详细地,可以通过moran图来反映可视化地图与统计量之间的对应关系,从而理解如何通过可视化地图来识别空间模式。

基于Python的空间分布初步-学习笔记(一)

 案例:城市拥堵的空间自相关检验

(一)案例使用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}。")

基于Python的空间分布初步-学习笔记(一)     p值为0.01,拒绝原假设,具有空间自相关性。

五、总结与展望

(一)空间数据拓展——时空数据

(二)空间模式识别——依赖性和异质性

(三)空间建模

上一篇:使用Echarts绘制geo地图(案例)


下一篇:3ds Max快速制作超真实的电池图标