注:矢量数据应该是datasource 栅格是dataset
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))
读取出的数据长这样:
# 获取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)
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重新组织)
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()