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()

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

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

相关推荐
SelectDB技术团队13 分钟前
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
大数据·数据库·数据仓库·数据分析·doris
nuclear201125 分钟前
使用Python 在Excel中创建和取消数据分组 - 详解
python·excel数据分组·创建excel分组·excel分类汇总·excel嵌套分组·excel大纲级别·取消excel分组
Lucky小小吴40 分钟前
有关django、python版本、sqlite3版本冲突问题
python·django·sqlite
GIS 数据栈1 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis
爱分享的码瑞哥1 小时前
Python爬虫中的IP封禁问题及其解决方案
爬虫·python·tcp/ip
statistican_ABin2 小时前
R语言数据分析案例45-全国汽车销售数据分析(可视化与回归分析)
数据挖掘·数据分析
soso19682 小时前
DataWorks快速入门
大数据·数据仓库·信息可视化
前端拾光者2 小时前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
傻啦嘿哟2 小时前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel
B站计算机毕业设计超人2 小时前
计算机毕业设计SparkStreaming+Kafka旅游推荐系统 旅游景点客流量预测 旅游可视化 旅游大数据 Hive数据仓库 机器学习 深度学习
大数据·数据仓库·hadoop·python·kafka·课程设计·数据可视化