Heim > Backend-Entwicklung > Python-Tutorial > Die Analyse der geografischen Datenverarbeitung in Python verwendet GR für Vektoren

Die Analyse der geografischen Datenverarbeitung in Python verwendet GR für Vektoren

coldplay.xixi
Freigeben: 2021-02-07 09:47:07
nach vorne
3304 Leute haben es durchsucht

Die Analyse der geografischen Datenverarbeitung in Python verwendet GR für Vektoren

Empfohlenes kostenloses Lernen: Python-Video-Tutorial

1. Overlay-Analyse:

Plotfarbe:
'r' rot, 'g' grün, „b“ Blau, „c“ Cyan, „y“ Gelb, „m“ Magenta, „k“ Schwarz, „w“ Weiß. Die Analyse der geografischen Datenverarbeitung in Python verwendet GR für Vektoren
    Einfache Karte der Stadtgrenzen, Gewässer und Feuchtgebiete von New Orleans:

1. Analyse des städtischen Sumpfgebiets von New Orleans:

Die Analyse der geografischen Datenverarbeitung in Python verwendet GR für Vektoren

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()
Nach dem Login kopieren

  2. Berechnen Sie das Feuchtgebiet der Stadt Bereich:

Die Analyse der geografischen Datenverarbeitung in Python verwendet GR für Vektoren

# 获得城市内的湿地多边形# 将多边形的面积进行累加# 除以城市面积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))
Nach dem Login kopieren
28.7% of New Orleans is wetland
Nach dem Login kopieren
Nach dem Login kopieren

Hinweis: Filtern Sie unnötige Features durch räumliche Filterung und Attributfilterung, wodurch die Verarbeitungszeit erheblich verkürzt werden kann. ??

  1. Bestimmen Sie, wie viele Städte in den Vereinigten Staaten im Umkreis von 10 Meilen (1 Meile = 1609,3 Meter) von einem Vulkan entfernt sind. Eine problematische Methode zur Bestimmung der Anzahl von Städten in der Nähe eines Vulkans:

# 将湖泊数据排除# 在内存中创建一个临时图层# 将图层相交,将结果储存在临时图层中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))
Nach dem Login kopieren
28.7% of New Orleans is wetland
Nach dem Login kopieren
Nach dem Login kopieren

2. Eine bessere Methode zur Bestimmung der Anzahl von Städten in der Nähe eines Vulkans:

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()))
Nach dem Login kopieren
Cities: 83
Nach dem Login kopieren

Hinweis: UnionCascaded(): Kombiniert effektiv alle Polygone in Ein zusammengesetztes Polygon

 im ersten Beispiel wird immer dann in die Ausgabe kopiert, wenn sich eine Stadt innerhalb der Vulkanpufferzone befindet. Beachten Sie, dass eine Stadt, die sich innerhalb mehrerer 16.000-Meter-Pufferzonen befindet, mehr als einmal einbezogen wird. 3. Berechnen Sie die Entfernung zwischen einer bestimmten Stadt und dem Vulkan: Wert berücksichtigen, der Die tatsächliche Entfernung beträgt 5.

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()))
Nach dem Login kopieren
Cities: 78
Nach dem Login kopieren
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))
Nach dem Login kopieren
92656 meters (57.91 miles)
Nach dem Login kopieren
 Die Fläche von 2,5D beträgt tatsächlich 141.

# 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))
Nach dem Login kopieren
rrreeVerwandte kostenlose Lernempfehlungen:

Python-Tutorial

(Video)

Das obige ist der detaillierte Inhalt vonDie Analyse der geografischen Datenverarbeitung in Python verwendet GR für Vektoren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage