GeoPandas在地理空间数据分析中的应用

GeoPandas 是一个开源的Python库,专门用于处理和分析地理空间数据。它建立在Pandas库的基础上,扩展了Pandas的数据类型,使得用户能够在Python中方便地进行GIS操作。GeoPandas的核心数据结构是GeoDataFrame,它是Pandas的DataFrame的子类,可以存储几何列并执行空间操作。此外,GeoPandas还依赖于Shapely库来执行几何操作,依赖于pyogrio进行文件访问,以及依赖于matplotlib进行绘图。

以下是GeoPandas的一些主要特性:

  1. 读取和写入多种地理空间数据格式:如Shapefile、GeoJSON、PostGIS、KML等。
  2. 支持地理空间几何图形的创建、编辑和分析:包括点、线、面等。
  3. 提供空间连接、缓冲区分析、几何运算等地理空间操作
  4. 具备数据可视化能力:可以绘制地理空间数据的地图。

一:数据读取

以下是各种地理空间数据格式的简单介绍及示例:

1:Shapefile

Shapefile 是一种常见的地理空间数据格式,由多个文件组成,包括主文件(.shp)、索引文件(.shx)、属性表文件(.dbf)等。

Shapefile 的主文件(.shp文件)是一种二进制文件,用于存储地理要素的几何形状和属性信息。以下是关于 Shapefile 主文件的一些特点:

Shapefile 的主文件由固定长度的文件头和一系列可变长度的记录组成。

  1. 文件头:包含有关 Shapefile 的总体信息,如文件代码、版本号、文件长度、几何类型等。文件头的长度为 100 字节。
  2. 记录:每个记录代表一个地理要素,记录的长度取决于几何类型和属性信息的复杂性。记录由记录头和几何形状数据组成。
  3. 坐标系统信息 :Shapefile 本身不包含坐标系统信息,但通常会与一个投影文件(.prj文件)一起使用,该文件描述了 Shapefile 中地理要素的坐标系统。

总的来说,Shapefile 的主文件是一种复杂的二进制文件格式,用于存储地理要素的几何形状和属性信息。要正确读取和处理 Shapefile 文件,需要使用专门的地理信息系统软件或库,如 geopandas

数据读取操作:

python 复制代码
import geopandas as gpd

gdf = gpd.read_file('path_to_shapefile.shp')

以下是一个用geopandas读取一个 Shapefile 文件后,GeoDataFramegdf)可能的输出样例:

python 复制代码
import geopandas as gpd

# 假设读取一个表示城市边界的 Shapefile 文件
gdf = gpd.read_file('cities.shp')

print(gdf.head())

输出可能如下:

   id        name geometry
0   1     New York  POLYGON ((-74.006011 40.7127281, -74.0059741...
1   2       London  MULTIPOLYGON (((-0.127592 51.5073219, -0.127...
2   3      Paris  POLYGON ((2.3477772 48.8588587, 2.3478284 48.8...
3   4     Tokyo  MULTIPOLYGON (((139.741229 35.681199, 139.741...
4   5  Los Angeles  MULTIPOLYGON (((-118.243683 34.0522342, -118...

在这个例子中,假设 Shapefile 文件有idname两个属性字段和表示几何形状的geometry列。geometry列中的值可以是点、线、多边形等不同的几何对象,具体取决于数据的内容。例如,这里显示了一些城市的名称以及对应的多边形几何形状表示城市边界。

2:GeoJSON

GeoJSON 是一种基于 JSON 的开放标准格式,用于表示地理空间数据。示例如下:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [10, 20]
      },
      "properties": {
        "name": "Sample Point"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [[[11, 21],[12, 22],[13, 21],[11, 21]]]
      },
      "properties": {
        "name": "Sample Polygon"
      }
    }
  ]
}

数据读取操作:

python 复制代码
import geopandas as gpd

gdf = gpd.read_file('path_to_geojson.json')

3:PostGIS

PostGIS 是 PostgreSQL 数据库的一个空间扩展,它在数据库中存储和处理地理空间数据。

示例(在 PostgreSQL 数据库中的查询结果):

sql 复制代码
-- 查询一个表中的几何列和属性列
SELECT geom, name FROM my_table;

假设表中有一个点和一个多边形对象,结果可能如下:

geom name
POINT(10 20) Point Object
POLYGON((11 21,12 22,13 21,11 21)) Polygon Object

首先安装必要的库:psycopg2sqlalchemy(如果使用 SQLAlchemy 连接数据库),其中,usernamepasswordhostportdatabase_name分别为数据库的用户名、密码、主机地址、端口号和数据库名称。your_table是要查询的表名,geometry_column_name是包含几何数据的列名。数据读取方式如下:

python 复制代码
import geopandas as gpd
from sqlalchemy import create_engine

# 创建数据库连接引擎
engine = create_engine('postgresql://username:password@host:port/database_name')

# 查询数据库表并读取为 GeoDataFrame
sql = "SELECT * FROM your_table"
gdf = gpd.read_postgis(sql, engine, geom_col='geometry_column_name')

4:KML

KML(Keyhole Markup Language)是一种用于表示地理信息的 XML 格式,常用于 Google Earth 等软件。

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Placemark>
    <name>Sample Point</name>
    <Point>
      <coordinates>10,20,0</coordinates>
    </Point>
  </Placemark>
  <Placemark>
    <name>Sample Polygon</name>
    <Polygon>
      <outerBoundaryIs>
        <LinearRing>
          <coordinates>11,21,0 12,22,0 13,21,0 11,21,0</coordinates>
        </LinearRing>
      </outerBoundaryIs>
    </Polygon>
  </Placemark>
</kml>

数据读取方式如下:

import geopandas as gpd

gdf = gpd.read_file('path_to_kml.kml', driver='KML')

二:数据可视化

1:用Python标记世界地图

python 复制代码
import geopandas as gpd
import matplotlib.pyplot as plt
import contextily as ctx
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体等中文字体
# 获取自然地球数据集(包含世界各国的边界等信息)
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

# 定义要标记的固定经纬度点
latitude = 40.7128  # 例如纽约市纬度
longitude = -74.0060  # 例如纽约市经度

# 创建地图
fig, ax = plt.subplots(figsize=(15, 10))

# 绘制世界地图
world.plot(ax=ax)

# 绘制标记点
ax.scatter(longitude, latitude, color='red', s=100)

# 添加地图背景图
ctx.add_basemap(ax, zoom=2, source=ctx.providers.Stamen.Terrain)

plt.title('全球地图及标记点', size=15)
plt.show()

在这个示例中,首先读取世界地图数据集,然后定义了一个固定的经纬度点(这里以纽约市 为例),在地图上绘制世界地图后,使用scatter绘制标记点。最后添加地图背景图。可以根据实际需求修改标记的经纬度点和标签内容。标记后的世界地图如下:

2:用Python标记我国城市

python 复制代码
import geopandas as gpd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体等中文字体

# 读取中国行政区划的 GeoDataFrame
china = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
china = china[china['iso_a3'] == 'CHN']

# 创建地图
fig, ax = plt.subplots(figsize=(10, 8))

# 绘制中国地图
china.plot(ax=ax)

# 定义一些城市的经纬度和名称
cities = {
    '北京': (116.4074, 39.9042),
    '上海': (121.4737, 31.2304),
    '广州': (113.2644, 23.1291),
    '深圳': (114.0579, 22.5431),
    '成都': (104.0657, 30.5723)
}

# 在地图上标记城市位置
for city_name, (longitude, latitude) in cities.items():
    ax.scatter(longitude, latitude, color='red', s=50)

plt.show()

以上操作可以根据经纬度上标记一些城市位置,例如北京,上海,广州,深圳和成都,标记后的大致的地理位置演示图如下:

想要探索多元化的数据分析视角,可以关注之前发布的相关内容。

相关推荐
小唐C++1 小时前
C++小病毒-1.0勒索
开发语言·c++·vscode·python·算法·c#·编辑器
云天徽上1 小时前
【数据可视化】全国星巴克门店可视化
人工智能·机器学习·信息可视化·数据挖掘·数据分析
大嘴吧Lucy1 小时前
大模型 | AI驱动的数据分析:利用自然语言实现数据查询到可视化呈现
人工智能·信息可视化·数据分析
北 染 星 辰1 小时前
Python网络自动化运维---用户交互模块
开发语言·python·自动化
codists1 小时前
《CPython Internals》阅读笔记:p336-p352
python
Мартин.2 小时前
[Meachines] [Easy] GoodGames SQLI+Flask SSTI+Docker逃逸权限提升
python·docker·flask
日日行不惧千万里2 小时前
如何用YOLOv8训练一个识别安全帽的模型?
python·yolo
LuiChun2 小时前
Flutter接django后台文件通道
python·flutter·django
Elastic 中国社区官方博客3 小时前
设计新的 Kibana 仪表板布局以支持可折叠部分等
大数据·数据库·elasticsearch·搜索引擎·信息可视化·全文检索·kibana
阿俊仔(摸鱼版)3 小时前
Python 常用运维模块之Shutil 模块
linux·服务器·python·自动化·云服务器