Procesamiento de datos geográficos de Python 3: lectura y escritura de datos vectoriales (1)

1. Datos vectoriales

  Las características geográficas con límites claros, como las ciudades, pueden estar bien representadas por datos vectoriales. Sin embargo, los datos continuos (como los datos de elevación) no funcionarán. Si se encuentra en una zona montañosa, es muy difícil dibujar un polígono en el límite de todas las áreas con la misma elevación. Sin embargo, se pueden usar diferentes polígonos para distinguir diferentes rangos de altitud. Muchos tipos de datos son muy adecuados para ser representados por vectores. Por ejemplo, para los elementos de un mapa de carreteras, las carreteras se representan mediante segmentos de línea, las ciudades y condados se representan mediante polígonos y las ciudades se representan mediante puntos o polígonos, según la escala del mapa. Todos los elementos del mapa pueden expresarse mediante puntos, líneas y polígonos.
  Los datos vectoriales son muy adecuados para hacer mapas, pero existen algunas deficiencias. Por ejemplo, al dibujar y mostrar, cómo acercar y alejar puede lograr un mejor efecto de visualización.

Paradoja de
  la línea costera El matemático británico Lewis Fry Richardson fue la primera persona en medir la línea costera de la tierra. Pero el proceso de medición no es tan fácil, porque el resultado final de la medición depende completamente de la escala seleccionada. Por ejemplo, una amplia costa con múltiples estrechos tiene una carretera a su lado. Imagínese conduciendo por esta carretera, usando el odómetro del automóvil para medir la distancia, y luego saliendo del automóvil y caminando de regreso por donde vino. Sin embargo, al caminar, sigue la curva del borde del estrecho, mientras que la carretera no. Es fácil darse cuenta de que el viaje es más largo que conducir, porque hay muchos desvíos. El mismo principio se aplica a la medición de toda la costa, porque si mide en incrementos más pequeños, puede medir más cambios. Al medir la costa británica, la longitud final medida con un incremento de 50 kilómetros es 600 kilómetros más larga que el incremento de 100 kilómetros.

  Shapefile es un formato general para almacenar datos vectoriales. Pero no es un archivo separado. Necesita al menos 3 archivos binarios, incluidos: 1 archivo maestro ( .shp ), 1 archivo de índice ( .shx ), información de geometría de almacenamiento y 1 tabla de dBASE ( .dbf ) para almacenar datos de atributos, y debe asegurarse de que todos tres archivos se almacenan en la misma carpeta.
1 archivo Shapefile  El otro formato es GeoJSON , que son archivos de texto sin formato y se pueden usar en cualquier editor de texto. Un GeoJSON contiene solo 1 archivo, que almacena toda la información necesaria.
Por ejemplo: mapa de formato de datos geojson en línea dibujar mapa
Inserte la descripción de la imagen aquí
Formato de archivo GeoJSON
manualmente

2. OGR

  La biblioteca de características simples OGR es parte de la Biblioteca de abstracción de datos geoespaciales (GDAL), que es una biblioteca de código abierto muy popular para leer y escribir datos espaciales. La parte OGR de GDAL tiene la función de leer y escribir muchos formatos de datos vectoriales diferentes . OGR también le permite crear y manipular las formas geométricas de entidades, editar sus valores de atributos, filtrar datos vectoriales basados ​​en valores de atributos o ubicaciones espaciales, y también proporciona capacidades de análisis de datos.
  La biblioteca GDAL se escribió originalmente en C y C ++, pero está vinculada a varios otros lenguajes, incluido Python, por lo que, aunque estos códigos no se reescriben en Python, se usa en Python para usar la biblioteca GDAL / OGR. Proporciona una interfaz. Por lo tanto, si desea utilizar GDAL en Python, debe instalar la biblioteca GDAL y los enlaces de Python correspondientes.

Estructura de clases OGR
  Esta fuente de datos contiene varios objetos de subcapa y cada capa representa un conjunto de datos en la fuente de datos.El shapefile contiene solo un conjunto de datos (una capa), Pero SpatiaLite contiene múltiples archivos. No importa cuántos conjuntos de datos haya en una fuente de datos, la OGR considera cada conjunto de datos como una capa.
  Una fuente de datos consta de una o más capas.
  En la tabla de atributos de Arcgis, cada fila representa una característica y cada columna representa un campo de atributo:

Tabla de atributos

2.1 ogrinfo

  Se utiliza para generar la información de datos vectoriales admitidos por OGR.
  Los errores que aparecen son:
Inserte la descripción de la imagen aquí
  Solución : Mueva ogr_FileGDB.dll de la carpeta osgeo \ gdalplugins a la carpeta osgeo.
móvil
  Ver información de parámetros:
Inserte la descripción de la imagen aquí
  Ver formatos admitidos (parte):
Inserte la descripción de la imagen aquí
  no solo le indica qué controladores están incluidos en la versión OGR, sino que también le indica si cada controlador admite operaciones de lectura y escritura.
  Puede usar Python para determinar qué controladores están disponibles y usar el entorno interactivo (IDLE) para la detección. Primero, importe el módulo OGR en el paquete osgeo y luego use ogr.GetDriverByName para encontrar un controlador específico:

>>> from osgeo import ogr
>>> driver = ogr.GetDriverByName('GeoJSON')  # GeoJSON不需要区分大小写
>>> print(driver)
<osgeo.ogr.Driver; proxy of <Swig Object of type 'OGRDriverShadow *' at 0x0000013B3CBE8840> 

  Demostración de errores:

>>> driver = ogr.GetDriverByName('shapefile') # 正确的名字为:Esri shapefile
>>> print(driver)
None

2.2 Actualizar comando pip (suplemento)

  1. No gane directamente + R y luego cmd, sino que elija "Inicio" - "Sistema de Windows" - "Símbolo del sistema" -Haga clic derecho en "Ejecutar como administrador". ! !
python -m pip install --upgrade pip;
  1. Después de ejecutar el símbolo del sistema como administrador, useDescarga y actualización del espejo!!!
python -m pip install --upgrade pip -i https://pypi.douban.com/simple

actualización exitosa
延迟 问题 : aumenta ReadTimeoutError (self._pool, None, 'Read timed out.')

pip install --index-url https://pypi.douban.com/simple <model>
 
如:pip install --index-url https://pypi.douban.com/simple opencv-python

o:

pip --default-timeout=100 install -U pip

Descarga de espejo: (rápida, estable, efectiva en pro-test)

  1. Espejo de Tsinghua: https://pypi.tuna.tsinghua.edu.cn/simple
  2. Ali: http://mirrors.aliyun.com/pypi/simple
  3. Universidad de Ciencia y Tecnología de China: http://pypi.mirrors.ustc.edu.cn/simple
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com numpy

2.3 visualización ospybook 1.0-Python de datos geográficos

  1. Ventaja: puede ayudarlo a visualizar datos sin abrir otros programas de software
  2. Desventajas: poca interactividad

metodo de instalacion:

  1. Paquete de instalación: en la carpeta ospybook-1.0 (enlace de descarga: http://manning.com/garrard/?a_aid=geopy&a_bid=c3bae5be )
  2. Para instalar, ubique el directorio setup.py y abra la línea de comando para ejecutar:python setup.py compilación
  3. Corre de nuevo:instalación de python setup.py

 Muestra la lista de controladores disponibles en el módulo ospybook:

>>> import ospybook as pb  #  使用ospybook模块
>>> pb.print_drivers()     #  输出可用的驱动列表
ESRIC (readonly)
FITS (read/write)
PCIDSK (read/write)
netCDF (read/write)
PDS4 (read/write)
VICAR (read/write)
JP2OpenJPEG (readonly)
JPEG2000 (readonly)
PDF (read/write)
MBTiles (read/write)
BAG (read/write)
EEDA (readonly)
OGCAPI (readonly)
DB2ODBC (read/write)
ESRI Shapefile (read/write)
MapInfo File (read/write)

3. Lectura de datos vectoriales

  Abra un dataset en formato Shapefile de ArcGIS, que contiene un dataset global.
ne_50m_populated_places.shp
Hoja de datos de atributos
  Salida a través de Python:

import sys
from osgeo import ogr

fn = r'E:\Google\GIS\osgeopy data\global\ne_50m_populated_places.shp'
ds = ogr.Open(fn, 0) # ds = data source,0:表示以只读模式打开文件,1或True:表示以编辑模式打开
if ds is None:  # 确保shapefile文件不为空,可正常打开
    sys.exit('Could not open {0}.'.format(fn))
lyr = ds.GetLayer(0) # 获取图层索引,从0开始,不提供参数时,默认返回第1个图层

i = 0  # 从数据源中取回第1个图层,并遍历此图层中的前5个要素
for feat in lyr:

    
    pt = feat.geometry() # 获得几何对象
    x = pt.GetX()        # 获得坐标位置
    y = pt.GetY()

    # 获得属性值
    name = feat.GetField('NAME')
    pop = feat.GetField('POP_MAX')
    # pop = feat.GetFieldAsString('POP_MAX')  #  数据转换
    # pop = feat.GetFieldAsInteger('POP_MAX')
    print(name, pt, pop, x, y)
    i += 1
    if i == 5:
        break
del ds  # 删除ds变量,强制关闭文件
Bombo POINT (32.5332995248648 0.583299105614628) 75000 32.533299524864844 0.5832991056146284
Fort Portal POINT (30.2750016159794 0.671004121125236) 42670 30.27500161597942 0.671004121125236
Potenza POINT (15.7989964956403 40.6420021300982) 69060 15.798996495640267 40.642002130098206
Campobasso POINT (14.6559965589219 41.562999118644) 50762 14.655996558921856 41.56299911864397
Aosta POINT (7.31500259570618 45.7370010670723) 34062 7.315002595706176 45.7370010670723

3.1 Acceso a elementos específicos

  Método: Vea el valor de compensación específico de la característica, es decir, el número de característica (FID) El valor de compensación comienza en 0 y se utiliza para indicar la ubicación de la característica en este conjunto de datos.
  Obtenga la última característica de la capa:

>>> num_features = lyr.GetFeatureCount()
>>> last_feature = lyr.GetFeature(num_features - 1)
>>> print(last_feature.NAME)
Hong Kong

  Elemento actual: use la llamada a la función ResetReading ()

import os
import sys
from osgeo import ogr
data_dir = r'E:\Google chrome\Download\GIS with python\osgeopy-data\osgeopy-data\osgeopy-data-washington\osgeopy-data'

fn = os.path.join(data_dir, 'Washington', 'large_cities.geojson')
ds = ogr.Open(fn, 0)
lyr = ds.GetLayer(0)
print('First loop')
for feat in lyr:
    print(feat.GetField('Name'), feat.GetField('Population'))

print('Second loop')
lyr.ResetReading() # This is the important line.
for feat in lyr:
    pt = feat.geometry()
    print(feat.GetField('Name'), pt.GetX(), pt.GetY())

3.2 Ver datos

3.2.1 Ver propiedades

  Utilice la función print_attributes para generar información de valor de atributo:

print_attributes(lyr_or_fn, [n], [fields], [geom], [reset] )
  1. lyr_or_fn puede ser una capa o una ruta de origen de datos. Si es una fuente de datos, se utiliza la primera capa.
  2. n es un valor opcional, que se utiliza para establecer el número de registros de salida; todos los valores se emiten de forma predeterminada.
  3. fields es un valor opcional, que se utiliza para establecer la lista de campos de atributos incluidos en el resultado de salida, incluidos todos los campos de forma predeterminada.
  4. geom es un valor booleano opcional, que se utiliza para establecer si se generará el tipo de característica geométrica, el valor predeterminado es Verdadero.
  5. reset es un valor booleano opcional, que se utiliza para establecer si se restablece al primer registro antes de generar el valor; el valor predeterminado es verdadero.

  Los nombres y poblaciones de las primeras 3 ciudades en el archivo de salida:

>>> import ospybook as pb
>>> fn = r'E:\Google chrome\Download\GIS with python\osgeopy-data\osgeopy-data\osgeopy-data-global\osgeopy-data\global\ne_50m_populated_places.shp'
>>> pb.print_attributes(fn, 3, ['NAME', 'POP_MAX'] )

FID    Geometry                  NAME           POP_MAX    
0      POINT (32.533, 0.583)     Bombo          75000      
1      POINT (30.275, 0.671)     Fort Portal    42670      
2      POINT (15.799, 40.642)    Potenza        69060      
3 of 1249 features

  La función pb.print_attributes () se puede utilizar para ver la información de atributos de una pequeña cantidad de datos, pero no para ver la información de big data

3.2.2 Dibujar datos espaciales

  ospybook contiene clases que pueden visualizar el espacio de datos, por lo que involucra el módulo matplotlib de Python. Para trazar y mostrar datos, debe crear una nueva instancia de la clase VectorPlotter. En el modo interactivo, los datos de dibujo se mostrarán inmediatamente; cuando no esté en modo interactivo, después de dibujar los datos, debe llamar a la función de dibujo.
  función de la trama:

plot(self, geom_or_lyr, [symbol], [name], [kwargs])
  1. geom_or_lyr es un objeto de entidad, una capa o una ruta a una fuente de datos. Si es una fuente de datos, se dibujará y mostrará la primera capa de la fuente de datos.
  2. símbolo es un valor opcional, que se utiliza para establecer el estilo de símbolo de elementos geométricos
    1. fill = False: polígono hueco
    2. "Bo": círculo azul
    3. "Rs": cuadrado
    4. "B-": línea azul
    5. "R–": línea de puntos (cada unidad es horizontal)
    6. "G": línea de puntos (cada unidad es vertical)
  3. nombre es un valor opcional, que se utiliza para establecer un nombre para los datos para que se pueda acceder a ellos más tarde
  4. kwargs es un valor opcional, que se especifica mediante palabras clave. kwargs se usa a menudo como abreviatura de un número indeterminado de argumentos de palabras clave

matplotlib

Mapa dibujado por matplotlib:

>>> import os
>>> os.chdir(r'E:\Google chrome\Download\global') #  更改工作目录,可直接使用该文件夹下的文件名,而不需要从新键入整个目录
>>> from ospybook.vectorplotter import VectorPlotter
>>> vp = VectorPlotter(True)  #  创建一个交互式绘图面板
>>> from matplotlib.pyplot import *     # 此处需要导入matplotlib模块进行绘图
>>> vp.plot('ne_50m_admin_0_countries.shp', fill=False)  # fill参数使文件用空心多边形表示
>>> vp.plot('ne_50m_populated_places.shp', 'bo')  # bo表示蓝色圆圈
>>> vp.draw()

Mostrar resultados:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/amyniez/article/details/113061835
Recomendado
Clasificación