python的地理开发(1、读取矢量数据<geojson和shp>)

学习目录

  1. 矢量数据处理
    ------OGR模块简介
    ------矢量数据的读取
    ------要素信息的获取与处理
    ------矢量数据的写入
    ------数据分析案例
  2. 栅格数据处理
    ------栅格数据的特点
    ------ GDAL模块简介
    ------栅格数据的读写
    ------栅格数据的处理
    ------栅格计算
  3. 数据获取
    ------数据获取俩元
    ------API接口的数据获取
    ------ 网络爬虫数据获取
  4. 数据可视化
    ------基础统计图表
    ------空间数据的可视化
  5. 数据分析与建模
    ------统计分析
    ------机器学校

1 OGR简介

python的地理开发(1、读取矢量数据<geojson和shp>)_第1张图片

1 读取矢量文件

python的地理开发(1、读取矢量数据<geojson和shp>)_第2张图片
:矢量数据应该是datasource 栅格是dataset

step1: 打开geojson数据
import matplotlib.pyplot as plt
from osgeo import ogr
import requests

# 链接失效了
url = 'http://127.0.0.1/yunnan-json.html'
url = 'http://127.0.0.1/yunnan.json'

r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
print("text:", r.text)

# 先确定driver是geojson 不知道这种数据格式怎么获取
# 也可以用shapefile格式的打开
# 用ogr的open方法打开text 并装入datasource中
ds = ogr.Open(r.text)
# 查看ds类型
print("ds.type:", type(ds))

读取出的数据长这样:

step2: 获取数据的属性数据(按名称 / 按索引)
# 获取datasource中的所有图层(括号中写0表示获取第一曾layer)
lyr = ds.GetLqyer()
# 查看layer中有多少Feature
print(lyr.GetFeatureCount())

# 遍历layer中的每一个要素
# 每一个feature就是属性表中的一行
for fea in lyr:
    # GetField就是取属性表中的某一属性列,按照字段名称
    name = fea.GetField('name')
    # 也可按照字段索引
    # name = fea.GetField(1)
    print("name:", name)
step3: 获取数据的坐标并显示
for fea in lyr:
    # GetField就是取属性表中的某一属性列,按照字段名称
    name = fea.GetField('name')
    # 也可按照字段索引
    # name = fea.GetField(1)
    print("name:", name)

    # 先得到geometry属性
    geom = fea.geometry()
    # 找到多边形的外边界ring
    ring = geom.GetGeometryRef(0)
    # 获取外边界坐标
    coords = ring.GetPoints()
    # x和y通过zip分开
    x, y = zip(*coords)
    plt.plot(x, y, 'black')
    plt.fill(x, y, 'p')

geom打印出来

ring打印出来(x, y连在一起 --> 所以要用zip重新组织)

打开Shapefile格式的文件并显示(点、线、面)

1 打开面数据

# 打开面
ds = ogr.Open(r'F:\pycharm\py_workspace\6 gdal_ogr\gis_data\2县市级面.shp')
layer_polygon = ds.GetLayer(0)

# fea就是表格 GetField就是列
for fea in layer_polygon:
    # 按索引提取列值
    print(fea.GetField(1))
    # 打开多边形就要先得到geometry 再得到ring
    geom = fea.geometry()
    ring = geom.GetGeometryRef(0)

    coords = ring.GetPoints()
    print(coords)
    x, y = zip(*coords)

2 打开线数据

ds = ogr.Open(r'F:\pycharm\py_workspace\6 gdal_ogr\gis_data\市区道路.shp')
layer_line = ds.GetLayer(0)

for feature in layer_line:
    geom = feature.geometry()
    # 线数据没有ring
    coords = geom.GetPoints()
    if coords is None:
        continue
    x, y = zip(*coords)
plt.plot(x, y, 'r')

3 打开点数据

# 打开点
ds = ogr.Open(r'F:\pycharm\py_workspace\6 gdal_ogr\gis_data\1县市级点.shp')
layer = ds.GetLayer(0)

for fea in layer:
    geom = fea.geometry()
    # 点没有多个坐标
    x = geom.GetX()
    y = geom.GetY()
    plt.plot(x, y, 'o', markersize=5, color='r')
plt.show()

你可能感兴趣的:(python,开发语言,数据分析)