Daha çox

OGR istifadə edərək Clip performansını artırmaq?


Çoxbucaqlı bir dəstə bağlamağa çalışdığım bir sıra nöqtələr var. Faylların bir çox xüsusiyyəti var (150.000 polis, 8000 bal). Bu prosesi gündə bir dəfə həyata keçirmək üçün avtomatlaşdırmaq istərdim, buna görə əməliyyatı yazmaq üçün python / gdal / ogr istifadə edirəm. Lakin, bu, həddən artıq yavaşdır. ArcGIS-də Clip alətindən istifadə edərək eyni əməliyyatı yerinə yetirmək sadəcə dəqiqələrdə nəticə verir! Budur cəhd etdiyim bir ogr zəng:

ogr2ogr -clipsrc polygon.shp clipped_output.shp points.shp

və 5 saatdır işləyir. VRT faylını SQL ifadəsi ilə birlikdə poliqonların içinə düşən nöqtələrin sayını hesablamaq üçün istifadə etməyi də sınadım:

'ogrinfo -dialect SQLITE -sql "POLİQONLARDAN SAYI SEÇİN (*)

Bu da çox RAM və işləmə gücünə sahib bir virtual maşında bu günə qədər ~ 5 saat çəkdi. Bilmədiyim hesablama müddətini azalda biləcək başqa texnika və ya metodlar varmı? Yoxsa sadəcə bir şeyimi itirirəm?


ogr2ogr əmr sətri alətlərindən əmin deyiləm, baxmayaraq ki, python-da ogr istifadə edərək oxşar proseslər etməyə meylliyəm - buna bənzər bir şey: (bunların şəkillər olduğunu düşünsək)

from osgeo import ogr def ogrClip (polys, points, clipppedPoints): # hər shapefile üçün ayrı bir sürücü lazım olub olmadığına əmin deyilsiniz? shpdrv = ogr.GetDriverByName ('ESRI Shapefile') polyDS = shpdrv.Open (polys) ptsDS = shpdrv.Open (points) polys = polyDS.GetLayer (0) pts = ptsD.GetLayer (0) clipDS = shpdrv. , geom_type = ogr.wkbPoint) # clipDS-də istədiyiniz sahələri yaradın - məsələn biri fieldDef = ogr.FieldDefn ('myIntegerColumn', ogr.OFTInteger) clipDS.CreateField (fieldDef) # çoxlu və ya nöqtələrin arasından keçərək # məkan filtrini təyin edin. sürəti sınamaq üçün bu əmri tərs çevirdim ... polys içərisində poli üçün: polygeom = poly.GetGeometryRef () pts.SetSpatialFilter (polygeom) pt üçün pt üçün pt: # burada kəsişməni müəyyən edə bilərsən # nöqtələr çoxbucağın içindədir, ancaq sadə həndəsələr # onsuz işləyəcək kimi görünür newfeat = ogr.Feature (clipDS.GetLayerDefn ()) newfeat.SetGeometry (pt.GetGeometryRef ()) # bu yeni işləyəcəyini düşünürəm newfeat.SetField ('myIntegerColumm', pt.GetField (') originalColumn ')) # ... və s clipDS.CreateFeature (newfeat) newfeat = Yoxdur shpdrv = Yoxdur

bu anda bunu sınamadım - amma inşallah ümumi fikri əldə edəcəksən.


Bütün vektor sahəsi nəzərə alınmaqla kəsmə zonanız azdırsa, --spat xmin ymin xmax ymax istifadə edərək çox vaxt redaktə edə bilərsiniz. Yeganə problem bundan əvvəl xmin ymin xmax ymax hesablamağınız lazımdır.

Bənzər bir şey olacaq

ogr2ogr - spat xmin ymin xmax ymax -clipsrc polygon.shp clipped_output.shp points.shp