Python地理空间数据分析:从基础地图绘制到智能城市应用
Python在地理信息系统和空间数据分析中的应用
1. 地理空间数据处理基础
1.1 核心库介绍
Python的地理空间分析主要依赖于以下核心库:
# 导入地理空间数据处理所需的核心库
import geopandas as gpd # 处理空间数据的DataFrame
import folium # 交互式地图可视化
import rasterio # 栅格数据处理
import shapely # 几何对象操作
import osmnx as ox # 下载开放街道地图数据
1.2 空间数据类型与结构
理解地理空间数据需要掌握两种基本数据类型:矢量数据和栅格数据。这里以矢量数据为例:
from shapely.geometry import Point, Polygon, LineString
# 创建矢量数据示例
point = Point(116.3974, 39.9093) # 北京天安门坐标
polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]) # 矩形区域
line = LineString([(0, 0), (1, 1), (2, 2)]) # 线路径
# 计算空间关系
print(point.within(polygon)) # 判断点是否在多边形内
print(line.intersects(polygon)) # 判断线与多边形是否相交
2. 实战:构建智能城市交通分析系统
2.1 获取和处理城市路网数据
import osmnx as ox
import networkx as nx
class UrbanTransportAnalyzer:
def __init__(self, city_name):
self.city_name = city_name
self.street_network = None
def fetch_street_data(self):
"""下载并处理城市街道网络数据"""
try:
# 获取城市边界
city_boundary = ox.geocode_to_gdf(self.city_name)
# 下载路网数据
self.street_network = ox.graph_from_place(
self.city_name,
network_type='drive', # 驾驶网络
simplify=True
)
# 转换为GeoDataFrame
nodes, edges = ox.graph_to_gdfs(self.street_network)
return nodes, edges
except Exception as e:
print(f"数据下载失败: {e}")
return None, None
# 使用示例
analyzer = UrbanTransportAnalyzer("北京市,中国")
nodes, edges = analyzer.fetch_street_data()
2.2 路径优化与可达性分析
import pandas as pd
from sklearn.cluster import DBSCAN
import numpy as np
def analyze_reachability(graph, key_locations):
"""分析关键地点的可达性"""
# 计算节点中心性
centrality = nx.closeness_centrality(graph)
# 转换为DataFrame
centrality_df = pd.DataFrame.from_dict(
centrality,
orient='index',
columns=['centrality']
)
# 可达性分析
reachability_analysis = {}
for location_name, location_coords in key_locations.items():
# 找到最近的节点
nearest_node = ox.distance.nearest_nodes(
graph,
location_coords[0],
location_coords[1]
)
# 计算该节点的中心性
reachability_analysis[location_name] = centrality_df.loc[nearest_node, 'centrality']
return reachability_analysis