Daha çox

Shapely / Python çoxbucaqlı bir sıra arasında loop


Üst-üstə düşüb-düşmədiklərini təyin etmək üçün python-dan istifadə edərək çoxbucaqlı bir sıra arasından keçməyə çalışıram. Bunu proseduru ümumiləşdirmək və bir shapefile (Fiona vasitəsilə) gətirilən bir çox poliqon üçün etmək istədiyim üçün bunu əl ilə etmək istəmirəm. Bunlar indi sınaqdan keçirdiyim çoxbucaqlardırpolA = Çoxbucaqlı ([(0,0), (3,0), (3,3), (0,3)]) polB = Çoxbucaqlı ([(2, -1), (5, -1), ( 5,2), (2,2)]) polC = Çoxbucaqlı ([(5,2), (8,2), (8,5), (5,5)])Bunlardan bir kolleksiya yaratdımkolleksiya = [polA, polB, polC]və indi bir for loopun siyahıdan keçməsini və hər çoxbucaqlı ilə üst-üstə düşdüyünü yoxlamasını istəyirəm növbəti. Ancaq cəhd etdiyim heç bir şey işə yaramır, çünki bütün mümkün birləşmələri necə çevirib uğurla sınayacağımı bilmirəm. Məni başa düşdüyümü bilmirəm. Shapely of Fiona istifadə edərək bunu necə edəcəyinizi bilən varmı?


Siyahıda bir elementin mövqeyinə görə bəzi həllər:

polA = Çoxbucaqlı ([(0,0), (3,0), (3,3), (0,3)]) polB = Çoxbucaqlı ([(2, -1), (5, -1), ( 5,2), (2,2)]) polC = Çoxbucaqlı ([(5,2), (8,2), (8,5), (5,5)]) kolleksiya = [polA, polB, polC ]

İndeksə görə təkrarlama:

aralığında i üçün (len (kolleksiya) -1): çap kolleksiyası [i], kolleksiya [i + 1], kolleksiya [i]. toxunuşlar (kolleksiya [i + 1]) POLİGON ((0 0, 3 0, 3) 3, 0 3, 0 0)) POLİGON ((2 -1, 5 -1, 5 2, 2 2, 2 -1)) Yanlış POLİGON ((2 -1, 5 -1, 5 2, 2 2, 2 -1)) POLİGON ((5 2, 8 2, 8 5, 5 5, 5 2)) Doğrudur

İtertools (standart modul) ilə təkrarlama, təkrarlanan elementlər olmadan bütün birləşmələr

itertools.com birləşmələrindəki pol üçün itertools idxal edin (toplama, 2): çap pol [0], pol [1], pol [0]. toxunuşlar (pol [1]) POLİGON ((0 0, 3 0, 3 3, 0) 3, 0 0)) POLİGON ((2 -1, 5 -1, 5 2, 2 2, 2 -1)) Yanlış POLİGON ((0 0, 3 0, 3 3, 0 3, 0 0)) POLİGON ( (5 2, 8 2, 8 5, 5 5, 5 2)) Yalan POLİGON ((2 -1, 5 -1, 5 2, 2 2, 2 -1)) POLİGON ((5 2, 8 2, 8) 5, 5 5, 5 2)) Doğrudur

ya da Mike T-nin təklifi ilə

itertools.com birləşmələrindəki pol1, pol2 üçün (toplama, 2): çap pol1, pol2, pol1. toxunuşlar (pol2) POLYGON ((0 0, 3 0, 3 3, 0 3, 0 0)) POLİGON ((2 -1) , 5 -1, 5 2, 2 2, 2 -1)) POLİGON ((0 0, 3 0, 3 3, 0 3, 0 0)) POLİGON ((5 2, 8 2, 8 5, 5 5) , 5 2)) Yanlış POLİQON ((2 -1, 5 -1, 5 2, 2 2, 2 -1)) POLİGON ((5 2, 8 2, 8 5, 5 5, 5 2)) Doğru

İlə müqayisə edin

itertools.permutations içindəki pol üçün (toplama, 2): çap pol [0], pol [1], pol [0]. toxunuşlar (pol [1]) POLİGON ((0 0, 3 0, 3 3, 0 3, 0 0)) POLİQON ((2 -1, 5 -1, 5 2, 2 2, 2 -1)) Yanlış POLİGON ((0 0, 3 0, 3 3, 0 3, 0 0)) POLİGON ((5 2, 8 2, 8 5, 5 5, 5 2)) Yanlış POLİGON ((2 -1, 5 -1, 5 2, 2 2, 2 -1)) POLİGON ((0 0, 3 0, 3 3, 0 3, 0 0)) Yanlış POLİQON ((2 -1, 5 -1, 5 2, 2 2, 2 -1)) POLİGON ((5 2, 8 2, 8 5, 5 5, 5 2)) Doğru POLİGON ((5 2, 8 2, 8 5, 5 5, 5 2)) POLİGON ((0 0, 3 0, 3 3, 0 3, 0 0)) Yanlış POLİGON ((5 2, 8 2, 8 5) , 5 5, 5 2)) POLİGON ((2 -1, 5 -1, 5 2, 2 2, 2 -1)) Doğru

Python - Döngü içindəki əvvəlki və sonrakı dəyərlərə də baxın

itertools-dan idxal tee, islice, zəncir, izip def previous_and_next (some_iterable): qabaqcıllar, maddələr, əlaqələr = tee (some_iterable, 3) prevs = zəncir ([None], prevs) əlaqələr = zəncir (islice (nexts, 1, Yoxdur)) , [Yoxdur]) əvvəlki, maddə, əvvəlki və əvvəlki və sonrakı hissələrdə izx (əvvəllər, maddələr, əlaqələr) üçün qayıt (toplama): "Maddə indi", maddə, "sonrakı", nxt, "əvvəlki", əvvəlki Maddə indi POLYGON ((0 0, 3 0, 3 3, 0 3, 0 0)) sonrakı POLYGON ((2 -1, 5 -1, 5 2, 2 2, 2 -1)) əvvəlki Yoxdur Maddə indi POLYGON ((2 -1, 5 -1, 5 2, 2 2, 2 -1)) sonrakı POLYGON ((5 2, 8 2, 8 5, 5 5, 5 2)) əvvəlki POLYGON ((0 0 , 3 0, 3 3, 0 3, 0 0)) Maddə indi POLİGON ((5 2, 8 2, 8 5, 5 5, 5 2)) sonrakı Heç biri əvvəlki POLYGON ((2 -1, 5 -) 1, 5 2, 2 2, 2 -1))

GDAL & amp Python | Fəsil 3. Vektor məlumatlarının oxunması və yazılması

Fəsil 3. Vektor məlumatlarının oxunması və yazılması

Bu fəsil əhatə edir

  • Vektor məlumatlarını anlamaq
  • OGR-ni təqdim edirik
  • Vektor məlumatlarının oxunması
  • Yeni vektor məlumat dəstlərinin yaradılması
  • Mövcud məlumat dəstləri yenilənir

Bu günlərdə nadir görünür, amma yəqin ki, bükülüb avtomobilinizdə saxlanılması üçün hazırlanmış bir kağız yol xəritəsini gördünüz. İstifadə etdiyimiz ən yeni veb xəritələrdən fərqli olaraq, bu xəritələr hava görüntülərindən istifadə etmir. Bunun əvəzinə, xəritələrdəki xüsusiyyətlərin hamısı həndəsi cisimlər - yəni nöqtələr, xətlər və çoxbucaqlar şəklində çəkilir. Coğrafi xüsusiyyətlərin hamısının fərqli obyektlər olduğu bu tip məlumatlara deyilir vektor məlumat dəstləri .

Yalnız başqasının hazırladığı xəritələrə baxmağı planlaşdırmadığınız təqdirdə, bu tip məlumatları necə oxuyub yazacağınızı bilməlisiniz. Mövcud məlumatlarla hər hansı bir şəkildə işləmək istəsən, istər ümumiləşdirirsən, istər redaktə edəsən, istər yeni məlumatlar çıxarasan, istərsə də inkişaf etmiş məkan təhlilini aparasan, əvvəlcə bir sənəddən oxumalısan. Hər hansı bir yeni və ya dəyişdirilmiş məlumatı yenidən diskə yazmalısınız. Məsələn, ümummilli bir şəhər məlumat bazasına sahib olsanız, ancaq 100.000 nəfər və ya daha çox insanın yaşadığı şəhərlərin məlumatlarını təhlil etməyiniz lazımdırsa, bu şəhərləri orijinal məlumatlarınızdan çıxarıb kiçik şəhərlərə məhəl qoymadan analizlərinizi orada apara bilərsiniz. İstəyə görə daha kiçik məlumat dəstini daha sonra istifadə üçün yeni bir faylda saxlaya bilərsiniz.

Bu fəsildə vektor məlumatlarının arxasındakı əsas fikirləri və bu tip məlumat dəstlərini oxumaq, yazmaq və redaktə etmək üçün OGR kitabxanasından necə istifadə edəcəyinizi öyrənəcəksiniz.

3.1. Vektor məlumatlarına giriş

Ən əsası, vektor məlumatları coğrafi xüsusiyyətlərin ayrı-ayrı həndəsələr kimi göstərildiyi məlumatlardır - xüsusən nöqtələr, xətlər və çoxbucaqlar. Şəhərlər kimi fərqli sərhədləri olan coğrafi xüsusiyyətlər vektor məlumatları kimi yaxşı işləyir, lakin yüksəklik kimi davamlı məlumatlar işləmir. Ən azı dağlıq ərazidə olsaydınız, eyni yüksəklikdə olan bütün ərazilərin ətrafında tək bir çoxbucaq çəkmək çətin olardı. Bununla birlikdə, fərqli yüksəklik aralıklarını ayırmaq üçün çoxbucaqlı istifadə edə bilərsiniz. Məsələn, bir bölgə üçün subalp zonalarını göstərən poliqonlar, bir yüksəklik aralığı üçün yaxşı bir vəkil olardı, ancaq bu çoxbucaqlıların içindəki ətraflı yüksəklik məlumatlarının çoxunu itirərdiniz. Bir çox məlumat növü, əvvəllər göstərilən yol xəritəsindəki xüsusiyyətlər kimi bir vektor təqdimatı üçün əla namizəddir. Yollar xətlər, əyalətlər və əyalətlər çoxbucaqlı olaraq təmsil olunur və xəritənin miqyasına görə şəhərlər ya nöqtə, ya da çoxbucaqlı şəklində çəkilir. Əslində, xəritədəki bütün xüsusiyyətlər, ehtimal ki, nöqtələr, xətlər və ya çoxbucaqlı şəkillərdə təmsil olunur.

Ancaq bir xüsusiyyət çəkmək üçün istifadə olunan həndəsə növü miqyasdan asılı ola bilər. Şəkil 3.1 bunun bir nümunəsini göstərir. New York əyalətinin xəritəsində şəhərlər nöqtə, böyük yollar xətt, mahallar isə çoxbucaqlı olaraq göstərilir. New York City kimi daha kiçik bir ərazinin xəritəsi xüsusiyyətləri fərqli şəkildə simvollaşdıracaqdır. Bu vəziyyətdə yollar hələ də xəttlərdir, lakin şəhər və qəsəbələri nöqtələr yerinə çoxbucaqlıdır. İndi ballar kitabxana və ya polis bölməsi kimi xüsusiyyətləri təmsil etmək üçün istifadə ediləcəkdir.

Şəkil 3.1. Miqyasın müəyyən xüsusiyyətləri çəkmək üçün istifadə olunan həndəsələri necə dəyişdirdiyini göstərən bir nümunə. New York City əyalət xəritəsində bir nöqtədir, lakin şəhər xəritəsində bir neçə poliqondan ibarətdir.

Bu şəkildə təmsil olunmağa imkan verən bir çox coğrafi məlumat nümunəsini təsəvvür edə bilərsiniz. Genişlik və enlem kimi bir koordinat dəsti ilə təsvir edilə bilən hər şey bir nöqtə kimi təmsil edilə bilər. Bura şəhərlər, restoranlar, dağ zirvələri, hava stansiyaları və geocache yerləri daxildir. X və y koordinatlarına əlavə olaraq (en və boylam kimi) nöqtələr yüksəkliyi təmsil edən üçüncü bir z koordinatına sahib ola bilər.

Qapalı sərhədləri olan coğrafi ərazilər çoxbucaqlı olaraq təmsil edilə bilər. Buna misal olaraq əyalətlər, göllər, konqres bölgələri, poçt kodları və torpaq mülkiyyəti, şəhərlər və parklar kimi nöqtələr kimi simvollaşdırıla bilən eyni xüsusiyyətlərin bir çoxu verilmişdir. Çoxbucaqlı olaraq göstərilə bilən, lakin nöqtə olaraq deyil, digər xüsusiyyətlər ölkələri, qitələri və okeanları əhatə edir.

Doğrusal xüsusiyyətlər, belə yollar, çaylar, elektrik xətləri və avtobus marşrutları, hamısı özlərini xətt kimi xarakterizə etməyə borcludurlar. Yenə də miqyas bir dəyişiklik edə bilər. Məsələn, New Orleans xəritəsi, Mississippi çayını çox geniş olduğu üçün xəttdən çox poliqon kimi göstərə bilər. Bu da xəritədə Şəkil 3.2-də göstərildiyi kimi hamar bir xətt deyil, çayın düz olmayan sahillərini göstərməyə imkan verəcəkdir.

Şəkil 3.2. Çoxbucaqlı istifadə arasındakı fərq və xətt /> Mississippi çayını təmsil edən həndəsələr. Çoxbucaq bankdakı detalları göstərir, xətt göstərmir.

Ancaq vektor məlumatları həndəsələrdən daha çoxdur. Bu xüsusiyyətlərin hər birinin əlaqəli xüsusiyyətləri var. Bu atributlar birbaşa çoxbucağın sahəsi və ya perimetri və ya bir xəttin uzunluğu kimi həndəsənin özünə aid ola bilər, lakin digər atributlar da mövcud ola bilər. Şəkil 3.3-də dövlət adını, ixtisarını, populyasiyasını və digər məlumatları hər bir xüsusiyyət ilə birlikdə saxlayan əyalətlər verilənlər bazasının sadə bir nümunəsi göstərilir. Şəkildən də göründüyü kimi bu atributlar müxtəlif növ ola bilər. Şəhər əhalisi və ya yol sürət həddi, şəhər və ya yol adları kimi simlər və ya torpaq sahəsinin alındığı və ya son qiymətləndirildiyi tarix kimi tarixlər kimi ədədi ola bilər. Bəzi vektor məlumatları, fotoşəkil kimi ikili məlumatları saxlamaq üçün istifadə edilə bilən BLOB'ları da (ikili böyük obyektlər) dəstəkləyir.

Şəkil 3.3. ABŞ daxilində dövlət sərhədlərini ehtiva edən bir verilənlər bazası üçün atribut cədvəli. Hər bir dövlət çoxbucağının, məlumat cədvəlində 2010-cu ildə dövlət adı və populyasiya daxil olmaqla bir neçə atributla əlaqəli bir sıra var.

İndiyə qədər bu tip məlumatların xəritələr hazırlamaq üçün çox uyğun olduğu aydın olmalıdır, lakin bəzi səbəblər o qədər də açıq olmaya bilər. Bir nümunə, rəsm çəkərkən tərəzinin nə qədər yaxşı olmasıdır. Veb qrafika ilə tanışsınızsa, ehtimal ki, SVG (ölçeklenebilir vektor qrafika) kimi vektor qrafiklərinin fərqli tərəzilərdə göstərildiyi zaman PNG kimi raster qrafiklərdən daha yaxşı işlədiyini bilirsiniz. SVG haqqında heç bir şey bilmirsinizsə belə, şübhəsiz veb saytında pikselli və çirkin bir şəkil gördünüz. Bunun üçün nəzərdə tutulduğundan daha yüksək qətnamə ilə göstərilən bir raster qrafika. Bu vektor qrafika ilə baş vermir və eyni prinsip vektor CİS məlumatları üçün də tətbiq olunur. Ölçüsündən asılı olmayaraq həmişə hamar görünür.

Ancaq bu, miqyasın əhəmiyyətsiz olduğu anlamına gəlmir. Daha əvvəl də gördüyünüz kimi, miqyas coğrafi bir xüsusiyyəti təmsil etmək üçün istifadə olunan həndəsə növünə təsir edir, eyni zamanda bir xüsusiyyət üçün istifadə etməyinizə təsir edir. Çözüm haqqında düşünməyin sadə yolu onu təfərrüatlarına bərabərləşdirməkdir. Çözünürlük nə qədər yüksək olarsa, bir o qədər ətraflı göstərilə bilər. Məsələn, Amerika Birləşmiş Ştatlarının xəritəsi, Washington State sahillərindəki bütün San Juan Adalarını göstərməzdi və əslində, verilənlər bazasına bunları əlavə etmək lazım olmazdı. Ancaq yalnız Washington əyalətinin xəritəsi, 3.4-də göründüyü kimi mütləq adaları da əhatə edən daha yüksək qətnamə verilənlər bazasına ehtiyac duyur. Çözünürlükün yalnız ekran üçün deyil, həm də analiz üçün vacib olduğunu unutmayın. Məsələn, Vaşinqtonun iki xəritəsi sahil uzunluğu üçün son dərəcə fərqli ölçmələr təmin edərdi.

Şəkil 3.4. Çözümün fərqi göstərən bir nümunə. Qalın konturla göstərilən verilənlər bazası, kölgə ilə göstəriləndən daha aşağı bir qətnaməyə malikdir. İki məlumat dəstində mövcud olan detalların miqdarındakı fərqə diqqət yetirin.

COASTLINE PARADOX

Bir quru sahil xəttinin necə ölçülməsi barədə heç düşündünüzmü? İngilis riyaziyyatçısı Lewis Fry Richardson tərəfindən ilk dəfə qeyd olunduğu kimi, bu düşündüyünüz qədər asan deyil, çünki son ölçmə tamamilə miqyasdan asılıdır. Məsələn, yanından bir yol keçən bir çox başlıqlı vəhşi bir sahil hissəsini düşünün. Təsəvvür edin ki, o yol boyunca sürür və məsafəni ölçmək üçün avtomobilinizin sayğacından istifadə edirsiniz, sonra maşından düşüb gəldiyiniz yolla geri addımlayırsınız. Ancaq piyada olduğunuzda, başlıqların kənarları boyunca çıxırsınız və sahildə yolun keçmədiyi digər döngələrə əməl edirsiniz. Daha çox dövrə vurduğunuza görə sürdüyünüzdən daha çox gedəcəyinizi təsəvvür etmək asan olmalıdır. Eyni prinsip bütün sahil xəttini ölçərkən tətbiq olunur, çünki daha kiçik artımlarla ölçsəniz daha çox dəyişikliyi ölçə bilərsiniz. Əslində Böyük Britaniya sahillərini 100 km-lik addımlarla deyil, 50 km-lik artımlarla ölçmək son ölçümü təxminən 600 km artırır. Vaşinqton əyalətinin bir hissəsini istifadə edərək bunun 3.3 şəklində başqa bir nümunəsini görə bilərsiniz. Daha yüksək qətnamə verilənlər bazasındakı bütün bükülmələri və dönüşləri ölçsəydiniz, qaranlıq xətt ilə göstərilən aşağı qətnamə sahil şeridini ölçdüyünüzdən daha uzun bir sahil ölçüsü əldə edərdiniz. adalar.

Daha əvvəl də qeyd edildiyi kimi, vektor məlumatları yalnız xəritə hazırlamaq üçün deyil. Əslində, həyatım bundan asılı olsaydı, gözəl bir xəritə düzəldə bilməzdim, ancaq məlumatların təhlili barədə bir az daha çox şey bilirəm. Vektor məlumat analizinin ümumi bir növü, coğrafi xüsusiyyətlər arasındakı əlaqələri, ümumiyyətlə məkan əlaqələrini təyin etmək üçün bir-birinin üstünə qoymaqla ölçməkdir. Məsələn, iki xüsusiyyətin məkan üst-üstə düşdüyünü və üst-üstə düşən sahənin nə olduğunu müəyyən edə bilərsiniz. Şəkil 3.5, bataqlıq ərazilər verilənlər bazasında örtülmüş New Orleans şəhər sərhədlərini göstərir. Bu məlumatları New Orleans şəhəri daxilində sulak ərazilərin mövcud olduğunu və şəhərin ərazisinin nə qədərinin bataqlıq olduğunu və ya olmadığını müəyyən etmək üçün istifadə edə bilərsiniz.

Şəkil 3.5. Vektor örtükləmə əməliyyatının nümunəsi. Qaranlıq kontur New Orleans şəhəri sərhədidir və qaranlıq ərazi bataqlıqdır. Bu iki məlumat dəsti, New Orleans sərhədindəki sulak ərazilər olan ərazi faizini təyin etmək üçün istifadə edilə bilər.

Məkan münasibətlərinin başqa bir cəhəti də iki xüsusiyyət arasındakı məsafəsidir. İki hava stansiyası və ya bütün sendviç mağazaları arasındakı məsafəni ofisinizdən bir mil məsafədə tapa bilərsiniz. Bir neçə il əvvəl tədqiqatçıların həm məsafələrə, həm də məkan münasibətlərinə ehtiyac duyduğu bir işə kömək etdim. GPS yaxalı geyiklərin oxumalar arasında nə qədər məsafə qət etdiyini, həm də səyahət istiqamətini və yollar kimi süni xüsusiyyətlərlə necə qarşılıqlı əlaqədə olduqlarını bilmələri lazım idi. Xüsusilə bir sual, yolları keçib keçmədikləri və belədirsə, nə qədər olub-olmadığı idi.

Yollardan danışarkən, vektor məlumat dəstləri yol şəbəkələri kimi şəbəkələri təmsil etməkdə də yaxşı iş görürlər. Düzgün bir şəkildə qurulmuş bir yol şəbəkəsi, müxtəlif veb-Xəritəçəkmə saytlarında gördüyünüz nəticələrə bənzər iki yer arasındakı marşrutları və sürücülük vaxtlarını tapmaq üçün istifadə edilə bilər. Müəssisələr xidmət göstərmək üçün bu kimi məlumatlardan da istifadə edə bilərlər. Məsələn, bir pizza birləşməsi, çatdırılma sahələrini təyin etmək üçün 15 dəqiqəlik bir sürüşdə şəhərin hansı hissələrinə çata biləcəklərini təyin etmək üçün şəbəkə analizindən istifadə edə bilər.

Digər məlumat növlərində olduğu kimi, vektor məlumatlarını saxlamağın bir çox yolu var. Bir fotoşəkili JPEG, PNG, TIFF, bitmap və ya digər bir çox fayl növündən biri kimi saxlaya bildiyiniz kimi, vektor məlumatlarını saxlamaq üçün bir çox fərqli fayl formatı istifadə edilə bilər. Növbəti fəsildə imkanlar barədə daha çox danışacağam, amma bu fəsildə istifadə edəcəyimiz bir neçə ümumi formatı qısaca qeyd edəcəyəm.

Formalı sənədlər vektor məlumatlarını saxlamaq üçün populyar bir formatdır. Bununla yanaşı, bir shapefile tək bir sənəddən deyil. Əslində, bu format hər biri fərqli bir məqsədə xidmət edən ən azı üç ikili sənəd tələb edir. Həndəsə məlumatları .shp və .shx sənədlərində, atribut dəyərləri .dbf faylında saxlanılır. Bundan əlavə, indekslər və ya məkan istinad məlumatları kimi digər məlumatlar daha çox faylda saxlanıla bilər. Ümumiyyətlə bu sənədlər haqqında bir şey bilmək lazım deyil, ancaq hamısının eyni qovluqda bir yerdə saxlanıldığından əmin olmalısınız.

Xüsusilə veb-Xəritəçəkmə tətbiqetmələri üçün geniş yayılmış digər bir format GeoJSON'dur. Bunlar hər hansı bir mətn redaktorunda aça və baxa biləcəyiniz düz mətn sənədləridir. Bir shapefile fərqli olaraq, GeoJSON verilənlər bazası tələb olunan bütün məlumatları saxlayan bir fayldan ibarətdir.

Vektor məlumatları əlaqəli verilənlər bazalarında da saxlanıla bilər ki, bu da çox istifadəçi girişinə və müxtəlif növ indeksləşdirməyə imkan verir. Bunun ən geniş yayılmış variantlarından ikisi, geniş istifadə olunan verilənlər bazası sistemləri üçün qurulmuş məkan uzantılarıdır. PostGIS uzantısı PostgreSQL-in üstündə işləyir və SpatiaLite SQLite verilənlər bazaları ilə işləyir. Digər bir populyar verilənlər bazası formatı, mövcud bir verilənlər bazası sisteminin bir hissəsi olmaması ilə tamamilə fərqli olan Esri faylı geodatabase.

3.2. OGR-ə giriş

OGR Sadə Xüsusiyyətlər Kitabxanası, məkan məlumatlarını oxumaq və yazmaq üçün son dərəcə populyar bir açıq mənbə kitabxanası olan Coğrafi Məlumat Abstraksiya Kitabxanasının (GDAL) bir hissəsidir. GDAL-nin OGR hissəsi, bir çox fərqli vektor məlumat formatını oxumaq və yazmağı təmin edən hissədir. OGR ayrıca, atribut dəyərlərinə və ya məkan məkanına əsaslanan hüdudları düzəldən atribut dəyərlərini süzgəc vektor məlumatlarını yaratmağınıza və idarə etməyinizə imkan verir və eyni zamanda məlumat analiz imkanlarını da təklif edir. Bir sözlə, vektor məlumatları ilə işləmək üçün GDAL istifadə etmək istəyirsinizsə, OGR haqqında öyrənməyiniz lazım olan şeydir və növbəti dörd fəsildə də öyrənəcəksiniz.

GDAL kitabxanası əvvəlcə C və C & # 43 & # 43 dilində yazılmışdı, lakin Python da daxil olmaqla bir neçə başqa dildə bağlanma qabiliyyətinə malikdir, bu səbəbdən Python-dan GDAL / OGR kitabxanasına bir interfeys var, kodun Python-da yenidən yazılması deyil. Buna görə GDAL-ı Python ilə istifadə etmək üçün həm GDAL kitabxanasını, həm də Python bağlamalarını quraşdırmalısınız. Bunu hələ etməmisinizsə, ətraflı quraşdırma təlimatları üçün əlavə A-ya baxın.

OGR qısaltması onsuz da nə deməkdir? Əvvəllər OpenGIS Simple Features Reference Implementation üçün istifadə olunurdu, lakin OGR OpenGIS Simple Features spesifikasiyasına tam uyğun gəlmədiyi üçün ad dəyişdirildi və indi onun OGR hissəsi heç bir şey üçün dayanmır və yalnız tarixi xarakter daşıyır.

Bu fəsildə istifadə olunan bir neçə funksiya www.manning.com/books/geoprocessing-with-python saytında yükləmək üçün mövcud olan ospybook Python modulundadır. Bu modulu da qurmaq istəyəcəksiniz. Nümunə məlumat dəstləri eyni saytdan əldə edilə bilər.

OGR ilə işləməyə başlamazdan əvvəl, OGR kainatındakı müxtəlif cisimlərin bir-biri ilə necə əlaqəli olduğunu, 3.6-da göstərildiyi kimi baxmaq faydalıdır. Bu iyerarxiyi başa düşmürsənsə, məlumat oxumaq və yazmaq üçün lazım olan addımlar o qədər də mənalı olmayacaqdır. Bir shapefile, GeoJSON faylı, SpatiaLite və ya PostGIS verilənlər bazası kimi bir məlumat mənbəyi açmaq üçün OGR istifadə etdikdə bir DataSource obyektiniz olacaq. Bu məlumat mənbəyində məlumat mənbəyində olan hər bir verilənlər bazası üçün bir və ya daha çox alt Layer obyekti ola bilər. Bu fəsildə istifadə olunan shapefile nümunələri kimi bir çox vektor məlumat formatı yalnız bir verilənlər bazasını ehtiva edə bilər. Ancaq digərləri, məsələn SpatiaLite, birdən çox məlumat dəsti ehtiva edə bilər və bunun nümunələrini növbəti fəsildə görəcəksiniz. Bir məlumat mənbəyində neçə məlumat dəsti olmasından asılı olmayaraq, hər biri OGR tərəfindən bir qat hesab olunur. Dərsləri və araşdırmaları üçün müntəzəm olaraq CİS istifadə edən bir neçə tələbəm belə, əksər formalı sənədlərdən istifadə edirsə, bununla qarışıq qalırlar, çünki məlumat mənbəyi ilə həqiqi məlumatlar arasında bir təbəqə bir şeyin oturması əksikdir.

Şəkil 3.6. OGR sinif quruluşu. Hər bir məlumat mənbəyində birdən çox təbəqə ola bilər, hər təbəqədə bir çox xüsusiyyət ola bilər və hər xüsusiyyət bir həndəsə və bir və ya daha çox atribut ehtiva edir.

Həqiqi məlumatlardan danışarkən hər bir təbəqədə həndəsələri və onların xüsusiyyətlərini özündə cəmləşdirən Xüsusiyyət obyektləri toplusu var. QGIS kimi bir GIS-ə vektor məlumatlarını yükləsəniz və sonra xüsusiyyət cədvəlinə baxsanız, rəqəm 3.7-ə bənzər bir şey görərsiniz. Cədvəldəki hər sıra Əfqanıstanı təmsil edən xüsusiyyət kimi bir xüsusiyyətə uyğundur. Hər sütun bir atribut sahəsinə uyğundur və bu halda atributlardan ikisi SOVEREIGNT və TYPE-dir. Xüsusiyyətlərlə əlaqəli heç bir məkan məlumatı və ya həndəsi olmayan məlumat cədvəllərini aça bilsəniz də, həndəsə olan məlumat dəstləri ilə işləyəcəyik. Şəkil 3.7-də gördüyünüz kimi, geometrilər QGIS-də atribut cədvəlində görünmür, baxmayaraq ki, digər GIS proqram paketləri, məsələn ArcGIS, atribut cədvəlində bir forma sütunu göstərir.

Şəkil 3.7. QGIS-də göstərilən bir atribut cədvəlinin nümunəsi. Hər sətir bir xüsusiyyətə uyğundur və hər sütun bir atribut sahəsidir.

Hər hansı bir vektor məlumatlarına giriş üçün ilk addım məlumat mənbəyini açmaqdır. Bunun üçün OGR-yə məlumat formatınızla necə işləməyinizi izah edən uyğun bir sürücüyə sahib olmalısınız. GDAL / OGR veb saytı, OGR-in hamısına yaza bilməməsinə baxmayaraq oxuya bilən 70-dən çox vektor formatını siyahıya alır. Bunların hər birinin öz sürücüsü var. Çox güman ki, OGR versiyanız sadalananların hamısını dəstəkləmir, lakin çatışmayan bir şeyə ehtiyacınız varsa, hər zaman özünüz tərtib edə bilərsiniz (bunun bir çox halda edilməsindən daha asan olduğunu qeyd edin). Mövcud olan bütün formatların siyahısı və hər birinə aid xüsusi detallar üçün www.gdal.org/ogr_formats.html saytına baxın.

Sürücü, Geo-JSON və ya shapefile kimi müəyyən bir məlumat formatı üçün bir tərcüməçidir. OGR-yə həmin formatı necə oxumaq və yazmağı izah edir. Bir format üçün heç bir sürücü OGR-də tərtib edilmirsə, OGR onunla işləyə bilməz.

GDAL / OGR quraşdırmanızın müəyyən bir məlumat formatını dəstəklədiyindən əmin deyilsinizsə, hangi sürücülərin mövcud olduğunu öyrənmək üçün ogrinfo əmr satırı yardım proqramından istifadə edə bilərsiniz. Bu yardım proqramının kompüterinizdəki yeri əməliyyat sisteminizə və GDAL-nı necə qurduğunuza bağlıdır, buna görə əlavə A-ya yenidən müraciət etməyiniz lazım ola bilər. Bir əmr satırından istifadə etməyə öyrəşməmisinizsə, ogrinfo yürütülebilir faylı cüt vurmaq istəyə bilərsiniz, ancaq bu sizi heç bir yerdə faydalı edə bilməz. Bunun əvəzinə bir terminal pəncərəsindən və ya Windows komut istəməsindən ogrinfo-nu çalıştırmalısınız. Nə olursa olsun, yürütülə biləni tapdıqdan sonra onu --formatlar seçimi ilə çalıştırmaq istəyəcəksiniz. Şəkil 3.8, Windows 7 aparatımda işlədilməsinin bir nümunəsini göstərir, baxmayaraq ki, nəticənin çox hissəsini kəsmişəm.

Şəkil 3.8. Windows kompüterində bir GDAL əmr istəməsindən ogrinfo yardım proqramının işlədilməsinə bir nümunə

Gördüyünüz kimi, ogrinfo sizə OGR versiyanıza hansı sürücülərin daxil olduğunu deyil, həm də hər birinə yazıb yaza biləcəyini və ondan oxuya biləcəyini də izah edir.

OGR tərəfindən dəstəklənən vektor formatları haqqında məlumatı www.gdal.org/ogr_formats.html saytında əldə etmək olar.

Python istifadə edərək hansı sürücülərin mövcud olduğunu da təyin edə bilərsiniz. Əslində, cəhd edək. Ən sevdiyiniz Python interaktiv mühitini açaraq başlayın. IDLE (şəkil 3.9) istifadə edəcəyəm, çünki Python ilə paketlənir, ancaq hansından xoşunuz gəlsə istifadə edə bilərsiniz. Etməli olduğunuz ilk şey ogr modulunu idxal etməkdir. Bu modul, GDAL üçün Python bağlamalarını quraşdırdığınız zaman quraşdırılmış osgeo paketinin içərisində yaşayır. Bu paketdəki bütün modullara kiçik hərflərlə ad verilir, buna görə Python-da onlara müraciət etməlisiniz. Ogr idxal etdikdən sonra müəyyən bir sürücü tapmaq üçün ogr.GetDriverByName istifadə edə bilərsiniz:

dan osgeo idxal ogr

sürücü & # 61 ogr.GetDriverByName (& # 39GeoJSON & # 39)

Şəkil 3.9. Sürücüləri necə əldə ediləcəyini göstərən Python interaktiv sessiyası nümunəsi

Adı OGR Vektor Formatları veb səhifəsindəki Kod sütunundan istifadə edin. Etibarlı bir sürücü əldə edib çap etsəniz, obyektin yaddaşda saxlandığı yer barədə məlumat görəcəksiniz. Əhəmiyyətli olan, çap etmək üçün bir şey var idi, çünki uğurla bir sürücü tapdığınız deməkdir. Yanlış bir ad və ya itkin bir sürücünün adını ötürsəniz, funksiya Yoxdur. Nümunələr üçün şəkil 3.9-a baxın.

Ospybook modulunda print_drivers adlanan bir funksiya mövcud sürücülərin siyahısını da çap edəcəkdir. Bu rəqəm 3.9-da göstərilmişdir.

3.3. Vektor məlumatlarının oxunması

Artıq hansı formatlarla işləmək mümkün olduğunu bildiyiniz üçün, məlumatları oxumağın vaxtı gəldi. Osgeopy-məlumat qovluğunuzun qlobal alt qovluğundakı ne_50m_populated_places.shp verilənlər dəsti olan şəhərlər şəkli ilə başlayacaqsınız. QGIS-də açın və baxın. Yalnız şəkil 3.10-da göstərilən şəhərləri görməyəcəksiniz, həm də atribut cədvəlinin əksəriyyəti ekran görüntüsündə görünməyən sahələr toplusunu ehtiva etdiyini də görəcəksiniz.

Şəkil 3.10. QGIS-də göründüyü kimi ne_50m_populated_places.shp-dən həndəsələr və atributlar

Siyahı 3.1, bu verilənlər bazasındakı ilk 10 xüsusiyyət üçün adları, populyasiyaları və koordinatları yazdıran kiçik bir skript göstərir. Bir baxışdan dözülməz təfərrüatlara keçəcəyimiz üçün ilk baxışdan çox mənası yoxdursa, narahat olmayın. Fayl bu fəslin mənbə koduna daxil edilmişdir, buna görə də onu sınamaq istəsəniz, onu IDLE-də aça bilər, kodunuzun üçüncü sətrindəki fayl adını quraşdırmanıza uyğun dəyişdirə və sonra Çalıştır altında Modulu Çalıştır'ı seçin. menyu.

Siyahı 3.1. Bir şəkil şəklində ilk on xüsusiyyətdən məlumatların çap edilməsi

Əsas kontur sadədir. Etdiyiniz ilk şey shapefile açmaq və bu əməliyyatın nəticəsinin Heç birinə bərabər olmadığından əmin olmaqdır, çünki bu, məlumat mənbəyinin açılmaması deməkdir. Məlumat mənbəyi üçün qısaca bu dəyişən ds-yə müraciət edirəm. Faylın açıldığından əmin olduqdan sonra ilk qatı məlumat mənbəyindən alırsınız. Sonra təbəqədəki ilk 10 xüsusiyyəti təkrarlayırsınız və hər biri üçün həndəsə obyektini, koordinatlarını və NAME və POP_MAX atribut dəyərlərini əldə edirsiniz. Sonra birincisinə keçmədən əvvəl xüsusiyyət haqqında məlumatları yazdırırsınız. Tamamlandıqdan sonra sənədin bağlanmasına məcbur olmaq üçün ds dəyişənini silin.

Kodu müvəffəqiyyətlə çalıştırdınızsa, Python 3 istifadə edərkən mötərizəyə sahib olmayacağınıza baxmayaraq, buna bənzər bir 10 görünüşə sahib olmalısınız:

(& # 39Bombo & # 39, 75000, 32.533299524864844, 0.5832991056146284)

(& # 39Fort Portalı & # 39, 42670, 30.27500161597942, 0.671004121125236)

(& # 39Clermont-Ferrand & # 39, 233050, 3.080008095928406, 45.779982115759424)

Buna bir az daha ətraflı baxaq. Fayl adını və isteğe bağlı bir yeniləmə bayrağını Aç funksiyasına ötürərək bir məlumat mənbəyi açırsınız. Bu, OGR modulunda bağımsız bir funksiyadır, buna görə funksiya adını modul adı ilə əlavə edirsiniz ki, Python onu tapa bilsin. İkinci parametr təmin edilmirsə, defolt olaraq 0-a bərabərdir və bu sənəd yalnız oxunma rejimində açılacaqdır. Yeniləmədə açmaq və ya bunun yerinə redaktə etmək üçün 1 və ya True keçə bilərdiniz.

Fayl aça bilmirsə, Aç funksiyası None-u qaytarır, buna görə növbəti işiniz bunu yoxlamaq və bir səhv mesajı yazdırmaq və lazım olduqda çıxmaqdır. Bunun üçün yoxlamağı sevirəm ki, mövcud olmayan məlumat mənbəyini istifadə etməyə çalışarkən skriptin çökəcəyini gözləmək əvəzinə problemi dərhal və seçdiyim qaydada həll edə bilərəm (bu vəziyyətdə çıxın). 3.1 siyahısındakı fayl adını saxta birinə dəyişdirin və bu davranışı hərəkətdə görmək istəyirsinizsə, skripti işə salın:

əgər ds edir Heç biri:

sys.exit (& # 39Açılmadı <0>. & # 39 .format (fn))

Məlumat mənbələrinin məlumatları saxlayan bir və ya daha çox təbəqədən hazırlandığını unutmayın, buna görə də məlumat mənbəyini açdıqdan sonra qatı ondan əldə etməlisiniz. Məlumat mənbələrində bir qat indeksini və ya bir qat adını götürən və müvafiq məlumat mənbəyinin içindəki müvafiq Layer obyektini qaytaran GetLayer adlı bir funksiyası var. Layer indeksləri 0-dan başlayır, buna görə birinci qat 0, ikinci katalon 1 və s. GetLayer-a heç bir parametr təqdim etmirsinizsə, məlumat mənbəyindəki ilk qatı qaytarır. Şeffilin yalnız bir təbəqəsi var, buna görə indeksin texniki baxımdan bu halda ehtiyacı yoxdur.

İndi məlumatları qatınızdan çıxarmaq istəyirsiniz. Xatırladaq ki, hər təbəqə bir və ya daha çox xüsusiyyətdən ibarətdir, hər bir xüsusiyyət coğrafi obyekti təmsil edir. Həndəsələr və atribut dəyərləri bu xüsusiyyətlərə əlavə olunur, buna görə məlumatlarınızı almaq üçün onlara baxmaq lazımdır. Kodun ikinci yarısı, 3.1-də siyahıda ilk 10 xüsusiyyəti nəzərdən keçirir və hər biri haqqında məlumat yazdırır. Budur yenə də maraqlı hissəsi:

üçün feat lyr:

pop & # 61 feat. GetField (& # 39POP_MAX & # 39)

çap(ad, pop, x, y)

Laym for for ilə təkrarlaya biləcəyiniz xüsusiyyətlər toplusudur. Hər dəfə döngə içərisində feat dəyişən təbəqədəki növbəti xüsusiyyət olacaq və döngə dayanmadan əvvəl təbəqədəki bütün xüsusiyyətlər üzərində təkrarlanacaqdır. Bununla birlikdə, 1249 xüsusiyyətin hamısını çap etmək istəmirsiniz, buna görə ilk 10-dan sonra dayandırmağa məcbur edirsiniz.

Döngü içərisində etdiyiniz ilk şey həndəsəni xüsusiyyətdən əldə etmək və pt adlı dəyişənə yapışdırmaqdır. Həndəsəni əldə etdikdən sonra x və y koordinatlarını tutub sonra istifadə etmək üçün dəyişənlərdə saxlayırsınız.

Sonra NAME və POP_MAX sahələrindəki dəyərləri alırsınız və dəyişənlərdə də saxlayırsınız. GetField funksiyası bir atribut adı və ya indeks alır və bu sahənin dəyərini qaytarır. Atributları əldə etdikdən sonra mövcud xüsusiyyət haqqında topladığınız bütün məlumatları çap edirsiniz.

Xəbərdar olmağınız lazım olan bir şey GetField funksiyasının, əsas verilənlər bazasında olduğu kimi eyni məlumat növü olan məlumatları qaytarmasıdır. Bu nümunədə ad dəyişkənindəki dəyər bir sətirdir, ancaq pop-da saxlanılan dəyər bir rəqəmdir. Məlumatların başqa bir formatda olmasını istəyirsinizsə, dəyərləri müəyyən bir növ kimi qaytaran funksiyaların siyahısını görmək üçün əlavə B-yə baxın. Məsələn, popun başqa bir simlə birləşdirə bilməsi üçün bir simli olmasını istəsəniz, GetFieldAsString istifadə edə bilərsiniz.

pop & # 61 feat. GetFieldAsString (& # 39POP_MAX & # 39)

Bütün məlumat formatlarının bütün sahə tiplərini dəstəkləmədiyini və bütün məlumatların tiplər arasında müvəffəqiyyətlə çevrilə bilməyəcəyini unutmayın, bu səbəbdən bu avtomatik dönüşümlərə etibar etmədən əvvəl hər şeyi yaxşıca yoxlamalısınız. Bu funksiyalar məlumatları növlər arasında konvertasiya etmək üçün faydalı deyil, eyni zamanda məlumat növlərini kodunuzda daha aydın göstərmək üçün bunlardan da istifadə edə bilərsiniz. Məsələn, GetFieldAsInteger istifadə edirsinizsə, kodunuzu oxuyan hər kəs üçün dəyərin bir tam olduğu açıqdır.

3.3.1. Xüsusi xüsusiyyətlərə giriş

Bəzən hər xüsusiyyətə ehtiyacınız olmur, buna görə hamısını indiyə kimi etdiyiniz kimi təkrarlamaq üçün bir səbəbiniz yoxdur. Xüsusiyyətləri bir alt ilə məhdudlaşdırmanın güclü bir üsulu, onları atribut dəyərinə və ya məkan dərəcəsinə görə seçməkdir və bunu 5-ci fəsildə edəcəksiniz. Başqa bir yol da adlandırılan xüsusi ofsetli xüsusiyyətlərə baxmaqdır xüsusiyyət şəxsiyyətləri (FID). Ofset, xüsusiyyətin sıfırdan başlayaraq verilənlər bazasında olduğu mövqedir. Tamamilə xüsusiyyətin sənəddəki mövqeyindən asılıdır və yaddaşdakı sıralama sırası ilə heç bir əlaqəsi yoxdur. Məsələn, QGIS-də ne_50m_populated_places shapefile açarsanız və atribut cədvəlinə baxsanız, şəkil 3.11 A-da olduğu kimi Bombo-nu cədvəldəki ilk qeyd olaraq göstərərdiniz. Ən sol sütundakı nömrələrə baxın? Bunlar ofset dəyərləridir. Now try sorting the table by name by clicking on the NAME column header, as shown in figure 3.11 B. Now the first record shown in the table is the one for Abakan, but it has an offset of 346. As you can see, that left-most column isn’t a row number like you see in spreadsheets, where the row numbers are always in the right order no matter how you sort the data. These numbers represent the order in the file instead.

Figure 3.11. The attribute table for the ne_50m_populated_places shapefile. Table A shows the native sort order, with the FIDs in order. Table B has been sorted by city name, and the FIDs are no longer ordered sequentially.

If you know the offset of the feature you want, you can ask for that feature by FID. To get the feature for Vatican City, you use GetFeature(7) .

You can also get the total number of features with GetFeatureCount , so you could grab the last feature in the layer like this:

>> > last_feature = lyr.GetFeature(num_features - 1 )

You have to subtract one from the total number of features because the first index is zero. If you had tried to get the feature at index num_features, you’d have gotten an error message saying that the feature ID was out of the available range. This snippet also shows an alternate way of retrieving an attribute value from a feature, instead of using GetField , but it only works if you know the names beforehand so that you can hardcode them into your script.

The current feature

Another important point is that the functions that return features keep track of which feature was last accessed this is the current feature . When you first get the layer object, it has no current feature. But if you start iterating through features, the first time through the loop, the current feature is the one with an FID of zero. The second time through the loop, the current feature is the one with offset 1, and so on. If you use GetFeature to get the one with an FID of 5, that’s now the current feature, and if you then call GetNextFeature or start a loop, the next feature returned will be the one with offset 6. Yes, you read that right. If you iterate through the features in the layer, it doesn’t start at the first one if you’ve already set the current feature.

Based on what you’ve learned so far, what do you think would happen if you iterated through all of the features and printed out their names and populations, but then later tried to iterate through a second time to print out their names and coordinates? If you guessed that no coordinates would print out, you were right. The first loop stops when it runs out of features, so the current feature is pointing past the last one and isn’t reset to the beginning (see figure 3.12 ). No next feature is there when the second loop starts, so nothing happens. How do you get the current feature to point to the beginning again? You wouldn’t want to use a FID of zero, because if you tried to iterate through them all, the first feature would be skipped. To solve this problem, use the layer.ResetReading() function, which sets the current feature pointer to a location before the first feature, similar to when you first opened the layer.

Figure 3.12. The location of the current feature pointer at various times

3.3.2. Viewing your data

Before we continue, you might find it useful to know about functions in the ospybook module that will help you visualize your data without opening it in another software program. These don’t allow the level of interaction with the data that a GIS does, so opening it in QGIS is still a much better option for exploring the data in any depth.

Viewing attributes

You can print out attribute values to your screen using the print_attributes function, which looks like this:

print_attributes (lyr_or_fn, [n] , [fields] , [geom] , [reset] )

  • lyr_or_fn is either a layer object or the path to a data source. If it’s a data source, the first layer will be used.
  • n is an optional number of records to print. The default is to print them all.
  • fields is an optional list of attribute fields to include in the printout. The default is to include them all.
  • geom is an optional Boolean flag indicating whether the geometry type is printed. The default is True.
  • reset is an optional Boolean flag indicating whether the layer should be reset to the first record before printing. The default is True.

For example, to print out the name and population for the first three cities in the populated places shapefile, you could do something like this from a Python interactive window:


Videoya baxın: AutoGIS 2019 Lesson Shapely and geometric objects (Oktyabr 2021).