Maison > développement back-end > Tutoriel Python > L'analyse du traitement des données géographiques Python utilise GR pour les vecteurs

L'analyse du traitement des données géographiques Python utilise GR pour les vecteurs

coldplay.xixi
Libérer: 2021-02-07 09:47:07
avant
3302 Les gens l'ont consulté

L'analyse du traitement des données géographiques Python utilise GR pour les vecteurs

Recommandations d'apprentissage gratuites : Tutoriel vidéo Python

1. Analyse de superposition

Opération d'analyse de superposition :
Lanalyse du traitement des données géographiques Python utilise GR pour les vecteurs
Couleur du tracé : 'r' rouge, 'g' vert, 'b' Bleu, ' c'cyan, 'y' jaune, 'm' magenta, 'k' noir, 'w' blanc.

  

Une carte simple des limites de la ville de la Nouvelle-Orléans, des plans d'eau et des zones humides :

Lanalyse du traitement des données géographiques Python utilise GR pour les vecteurs  
1. Analyse des zones marécageuses urbaines de la Nouvelle-Orléans. :

import osfrom osgeo import ogrfrom ospybook.vectorplotter import VectorPlotter

data_dir = r'E:\Google chrome\Download\gis with python\osgeopy data'# 得到新奥尔良附近的一个特定的沼泽特征vp = VectorPlotter(True)water_ds = ogr.Open(os.path.join(data_dir, 'US', 'wtrbdyp010.shp'))water_lyr = water_ds.GetLayer(0)water_lyr.SetAttributeFilter('WaterbdyID = 1011327')marsh_feat = water_lyr.GetNextFeature()marsh_geom = marsh_feat.geometry().Clone()vp.plot(marsh_geom, 'c')# 获得新奥尔良边城市边界nola_ds = ogr.Open(os.path.join(data_dir, 'Louisiana', 'NOLA.shp'))nola_lyr = nola_ds.GetLayer(0)nola_feat = nola_lyr.GetNextFeature()nola_geom = nola_feat.geometry().Clone()vp.plot(nola_geom, fill=False, ec='red', ls='dashed', lw=3)# 相交沼泽和边界多边形得到沼泽的部分# 位于新奥尔良城市边界内intersection = marsh_geom.Intersection(nola_geom)vp.plot(intersection, 'yellow', hatch='x')vp.draw()
Copier après la connexion

Lanalyse du traitement des données géographiques Python utilise GR pour les vecteurs  
2 Calculer la superficie des zones humides de la ville :

# 获得城市内的湿地多边形# 将多边形的面积进行累加# 除以城市面积water_lyr.SetAttributeFilter("Feature != 'Lake'") # 限定对象water_lyr.SetSpatialFilter(nola_geom)wetlands_area = 0# 累加多边形面积for feat in water_lyr: 
    intersect = feat.geometry().Intersection(nola_geom)
    wetlands_area += intersect.GetArea()pcnt = wetlands_area / nola_geom.GetArea()print('{:.1%} of New Orleans is wetland'.format(pcnt))
Copier après la connexion
28.7% of New Orleans is wetland
Copier après la connexion
Copier après la connexion
  

Remarque : Grâce au filtrage spatial et Filtrage d'attributs, le filtrage des fonctionnalités inutiles peut réduire considérablement le temps de traitement.

  

3. Intersection de deux couches :

# 将湖泊数据排除# 在内存中创建一个临时图层# 将图层相交,将结果储存在临时图层中water_lyr.SetAttributeFilter("Feature != 'Lake'")water_lyr.SetSpatialFilter(nola_geom)wetlands_area = 0for feat in water_lyr:
    intersect = feat.geometry().Intersection(nola_geom) # 求交
    wetlands_area += intersect.GetArea()pcnt = wetlands_area / nola_geom.GetArea()print('{:.1%} of New Orleans is wetland'.format(pcnt))water_lyr.SetSpatialFilter(None)water_lyr.SetAttributeFilter("Feature != 'Lake'")memory_driver = ogr.GetDriverByName('Memory')temp_ds = memory_driver.CreateDataSource('temp')temp_lyr = temp_ds.CreateLayer('temp')nola_lyr.Intersection(water_lyr, temp_lyr)sql = 'SELECT SUM(OGR_GEOM_AREA) AS area FROM temp'lyr = temp_ds.ExecuteSQL(sql)pcnt = lyr.GetFeature(0).GetField('area') / nola_geom.GetArea()print('{:.1%} of New Orleans is wetland'.format(pcnt))
Copier après la connexion
rrree

2. Analyse de proximité (détermination de la distance entre les éléments)

OGR. comprend deux outils d'analyse de proximité : mesurer les distances entre les entités géométriques et créer des tampons.

  1. Déterminez combien de villes aux États-Unis se trouvent à moins de 10 miles (1 mile = 1609,3 mètres) d'un volcan.

Une manière problématique de déterminer le nombre de villes à proximité d'un volcan :

28.7% of New Orleans is wetland
Copier après la connexion
Copier après la connexion
from osgeo import ogr

shp_ds = ogr.Open(r'E:\Google chrome\Download\gis with python\osgeopy data\US')volcano_lyr = shp_ds.GetLayer('us_volcanos_albers')cities_lyr = shp_ds.GetLayer('cities_albers')# 在内存中创建一个临时层来存储缓冲区memory_driver = ogr.GetDriverByName('memory')memory_ds = memory_driver.CreateDataSource('temp')buff_lyr = memory_ds.CreateLayer('buffer')buff_feat = ogr.Feature(buff_lyr.GetLayerDefn())# 缓缓冲每一个火山点,将结果添加到缓冲图层中for volcano_feat in volcano_lyr:
    buff_geom = volcano_feat.geometry().Buffer(16000)
    tmp = buff_feat.SetGeometry(buff_geom)
    tmp = buff_lyr.CreateFeature(buff_feat)# 将城市图层与火山缓冲区图层相交result_lyr = memory_ds.CreateLayer('result')buff_lyr.Intersection(cities_lyr, result_lyr)print('Cities: {}'.format(result_lyr.GetFeatureCount()))
Copier après la connexion
  

2. Une meilleure façon de déterminer le nombre de villes à proximité d'un volcan :

Cities: 83
Copier après la connexion
from osgeo import ogr

shp_ds = ogr.Open(r'E:\Google chrome\Download\gis with python\osgeopy data\US')volcano_lyr = shp_ds.GetLayer('us_volcanos_albers')cities_lyr = shp_ds.GetLayer('cities_albers')# 将缓冲区添加到一个复合多边形,而不是一个临时图层multipoly = ogr.Geometry(ogr.wkbMultiPolygon)for volcano_feat in volcano_lyr:
    buff_geom = volcano_feat.geometry().Buffer(16000)
    multipoly.AddGeometry(buff_geom)# 将所有的缓冲区联合在一起得到一个可以使用的多边形作为空间过滤器cities_lyr.SetSpatialFilter(multipoly.UnionCascaded())print('Cities: {}'.format(cities_lyr.GetFeatureCount()))
Copier après la connexion

Remarque : UnionCascaded() : fusionne efficacement tous les polygones en un seul polygone composite   Dans le premier exemple, chaque fois qu'une ville se trouve dans la mémoire tampon du volcan, elle sera copiée dans le résultat de sortie. Notez qu'une ville située dans plusieurs zones tampons de 16 000 mètres sera incluse plus d'une fois.

   

3. Calculez la distance entre une ville spécifique et le volcan :

Cities: 78
Copier après la connexion
rrree   

3. Utilisez des objets géométriques 2,5D pour représenter la distance entre deux points :

import osfrom osgeo import ogrfrom ospybook.vectorplotter import VectorPlotter

data_dir = r'E:\Google chrome\Download\gis with python\osgeopy data'shp_ds = ogr.Open(os.path.join(data_dir, 'US'))volcano_lyr = shp_ds.GetLayer('us_volcanos_albers')cities_lyr = shp_ds.GetLayer('cities_albers')# 西雅图到雷尼尔山的距离volcano_lyr.SetAttributeFilter("NAME = 'Rainier'")feat = volcano_lyr.GetNextFeature()rainier = feat.geometry().Clone()cities_lyr.SetSpatialFilter(None)cities_lyr.SetAttributeFilter("NAME = 'Seattle'")feat = cities_lyr.GetNextFeature()seattle = feat.geometry().Clone()meters = round(rainier.Distance(seattle))miles = meters / 1600print('{} meters ({} miles)'.format(meters, miles))
Copier après la connexion
92656 meters (57.91 miles)
Copier après la connexion
# 2Dpt1_2d = ogr.Geometry(ogr.wkbPoint)pt1_2d.AddPoint(15, 15)pt2_2d = ogr.Geometry(ogr.wkbPoint)pt2_2d.AddPoint(15, 19)print(pt1_2d.Distance(pt2_2d))
Copier après la connexion
4.0
Copier après la connexion
Copier après la connexion
  Compte tenu de la valeur de l'élévation Z, la distance réelle est de 5.

# 2.5Dpt1_25d = ogr.Geometry(ogr.wkbPoint25D)pt1_25d.AddPoint(15, 15, 0)pt2_25d = ogr.Geometry(ogr.wkbPoint25D)pt2_25d.AddPoint(15, 19, 3)print(pt1_25d.Distance(pt2_25d))
Copier après la connexion
4.0
Copier après la connexion
Copier après la connexion
# 用2D计算面积ring = ogr.Geometry(ogr.wkbLinearRing)ring.AddPoint(10, 10)ring.AddPoint(10, 20)ring.AddPoint(20, 20)ring.AddPoint(20, 10)poly_2d = ogr.Geometry(ogr.wkbPolygon)poly_2d.AddGeometry(ring)poly_2d.CloseRings()print(poly_2d.GetArea())
Copier après la connexion
100.0
Copier après la connexion
 L'aire de 2,5D est en réalité de 141.

# 用2.5D计算面积ring = ogr.Geometry(ogr.wkbLinearRing)ring.AddPoint(10, 10, 0)ring.AddPoint(10, 20, 0)ring.AddPoint(20, 20, 10)ring.AddPoint(20, 10, 10)poly_25d = ogr.Geometry(ogr.wkbPolygon25D)poly_25d.AddGeometry(ring)poly_25d.CloseRings()print(poly_25d.GetArea())
Copier après la connexion
rrree

Recommandations d'apprentissage gratuites associées : Tutoriel Python(vidéo)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal