Vairāk

Vai pakāpeniski pietuvināt PyQGIS?

Vai pakāpeniski pietuvināt PyQGIS?


Attiecībā uz manu spraudni pyqgis 2.2 es veiksmīgi varu ielādēt vektoru slāni. Bet, kad es mēģinu tuvināt slāni, tas nedarbojas.

Kā rīkoties, lai tuvinātu slāņa pakāpi?


Es tikko izmēģināju jūsu priekšlikumu. Es ielīmēju jūsu koda fragmentu manā spraudnī. Bet diemžēl, kad es ielādēju vektoru slāni. Es cenšos tuvināt slāņa pakāpi (pateicoties labajam klikšķim -> tuvināt slāņa pakāpi). Man nav kļūdas ziņojuma, bet vektora slāņa pakāpes tālummaiņa nav mainīta.

Python.py (spraudņa saiti github) varat izlasīt šeit:

https://github.com/picardie-nature/clicnat-qgis/blob/master/plugin.py

Vai ir kādas domas?


Kaut kam līdzīgam zemāk vajadzētu darboties.

vLayer = iface.activeLayer () audekls = iface.mapCanvas () pakāpe = vLayer.extent () audekls.setExtent (pakāpe)

Viens veids, kā to izdarīt, būtu atlasīt visas slāņa funkcijas, tuvināt atlasīto un pēc tam noņemt visu atlasi:

izmantojiet šo kodu:

vlayer.selectAll () mCanvas = iface.mapCanvas () mCanvas.zoomToSelected () vlayer.removeSelection ()

DRS, kurā šobrīd atrodas visi dati, kā arī pati karte, sauc par WGS84. Šī ir ļoti izplatīta ģeogrāfisko koordinātu sistēma (GCS) datu attēlošanai. Bet, kā redzēsim, ir problēma.

  • Saglabājiet savu pašreizējo karti.
  • Pēc tam atveriet pasaules karti, kuru atradīsit zem exercise_data / world / world.qgs .
  • Tuviniet Dienvidāfriku, izmantojot Pietuvināt rīks.
  • Mēģiniet iestatīt skalu Mērogs laukā, kas atrodas Statusa josla gar ekrāna apakšdaļu. Atrodoties Dienvidāfrikā, iestatiet šo vērtību 1:5000000 (viens līdz pieci miljoni).
  • Pārvietojieties pa karti, vienlaikus uzmanot Mērogs laukā.

Vai pamanāt, ka mainās mērogs? Tas notiek tāpēc, ka jūs attālināties no viena pietuvinātā punkta 1:5000000 , kas atradās ekrāna centrā. Ap šo punktu mērogs ir atšķirīgs.

Lai saprastu, kāpēc, padomājiet par Zemes globusu. Tam gar ziemeļu uz dienvidiem iet līnijas. Šīs garuma līnijas atrodas tālu viena no otras pie ekvatora, bet tās satiekas pie poliem.

GCS jūs strādājat pie šīs sfēras, taču ekrāns ir plakans. Mēģinot attēlot sfēru uz līdzenas virsmas, rodas deformācijas, līdzīgi kā tas notiktu, ja jūs atvērtu tenisa bumbu un mēģinātu to izlīdzināt. Tas, ko kartē nozīmē, ir tas, ka garuma līnijas paliek vienādi tālu viena no otras, pat pie stabiem (kur tām jāsatiekas). Tas nozīmē, ka, ceļojot prom no ekvatora savā kartē, redzamo objektu mērogs kļūst arvien lielāks. Tas mums praktiski nozīmē to, ka mūsu kartē nav nemainīga mēroga!

Lai to atrisinātu, ļaujiet to vietā izmantot projicēto koordinātu sistēmu (PCS). PCS & # 8220projects & # 8221 vai pārveido datus tādā veidā, kas ļauj ņemt vērā mēroga izmaiņas un tos izlabo. Tāpēc, lai mērogs būtu nemainīgs, mums vajadzētu pārprojektēt savus datus, lai izmantotu PCS.


Piedāvātais risinājums

Tīkla slānis (QgsMeshLayer) sastāv no šādām galvenajām sastāvdaļām:

datu sniedzējs - tāpat kā pakalpojumu sniedzēji tiek izmantoti vektoru un rastra slāņiem, arī šī ir abstrakcija piekļuvei tīkla struktūrai un datiem tīkla augšpusē.

renderētājs - rūpējas par tīkla slāņa renderēšanu, lai attēlotu attēlus atbilstoši lietotāja norādītajai konfigurācijai

kešatmiņa - tā kā datu ielāde no datu sniedzēja var būt lēna, tiek izmantota kešatmiņa, lai dažus datus saglabātu atmiņā, lai ātri piekļūtu

Datu sniedzējs

Dažādiem failu formātiem var būt pieejami vairāki datu sniedzēji, taču viens slānis vienmēr norāda uz vienu datu sniedzēju (QgsMeshDataProvider)

Datu sniedzēja galvenie pienākumi ir:

  • atgriešanās tīkla struktūra (mezglu, malu un seju saraksts)
  • atgriezt metadatus par datu kopām (līdzīgi kā rastru joslu un to metadatu saraksta iegūšanai)
  • atgriezt datu kopu no datu kopas

Sākotnējā ieviešanā mēs pieņemam, ka datu sniedzēji būs tikai lasāmi. Nākotnē tas var mainīties, un var būt aicinājumi modificēt tīkla struktūru vai pievienot / noņemt / modificēt datu kopas.

Atveidotājs

Tīkla slāņa renderētājs (QgsMeshLayerRenderer) ir atbildīgs par kartes noteiktas platības zīmēšanu.
Tas ir atvasināts no QgsMapLayerRenderer un tiek izsaukts no QGIS karšu renderēšanas dzinēja.

Atveidotājs atveido datus no aktīvās datu kopas - lietotāji varēs izvēlēties, kura datu kopa ir aktīvā.

Atveidošana sastāv no trim darbībām, un lietotājam jāspēj konfigurēt, kuras darbības tiks izmantotas:

kontūru atveidošana. Tas interpolē vērtības no aktīvās datu kopas un piešķir katram pikseļam, kuru sedz acs, krāsu. Vektoru datu kopām par vērtībām tiek izmantoti vektoru lielumi.

vektoru atveidošana. Tas zīmē bultiņu simbolus ar atbilstošu mērogošanu datiem no aktīvās datu kopas. Acīmredzot tas ir iespējams tikai vektoru datu kopām.

acs apmetums. Aktīvā datu kopa šeit netiek izmantota - tiek atveidota tikai tīkla struktūra, pēc izvēles ar etiķetēm.

Atveidošanas algoritms sastāv no šādām darbībām:

  1. Ņemot vērā kartes apjomu, izmantojiet telpisko indeksu, lai noskaidrotu, kuri tīkla elementi ir nepieciešami renderēšanai
  2. Izmantojot elementu sarakstu, noskaidrojiet, kuri datu bloki būs nepieciešami no aktīvās datu kopas.
  3. Mēģiniet ielādēt nepieciešamos datu blokus no kešatmiņas. Ja bloki kešatmiņā nav pieejami, iegūstiet tos no datu sniedzēja un īslaicīgi saglabājiet kešatmiņā.
  4. Ejiet tīkla elementus kartes apjomā un atveidojiet pa vienam (vispirms kontūras, tad vektori, pēc tam siets).

Kešatmiņa

Lai pārliecinātos, ka piekļuve datiem ir pietiekami ātra, mums būs jāsaglabā kešatmiņa. Tas sastāvēs no šādām daļām:

Tīkla struktūra. Šai datu struktūrai varēs piekļūt ļoti bieži, un tā ir salīdzinoši maza, tāpēc to var saglabāt kešatmiņā kopumā.

Datu bloki. Piekļuve datu sniedzēju datiem var būt samērā lēna, un ļoti bieži karšu renderētājam laika gaitā būs nepieciešama piekļuve tai pašai vai līdzīgai datu apakškopai. Tajā pašā laikā kopējais datu blokos saglabāto datu apjoms var būt liels (gigabaitu secībā), tāpēc šī kešatmiņas daļa būs jāierobežo ar maksimālo kešatmiņas lielumu, un datu bloki būtu jāaizstāj ar nesenāko izmantotā (LRU) stratēģija.

"Atvasināts" trīsstūra siets. Izmanto, lai paātrinātu un vienkāršotu renderēšanu, kā arī nodrošina sietu renderēšanai 3D kartes skatā. Sīkāka informācija zemāk.

Telpiskais indekss. Kartes renderēšanai un slāņu identificēšanai mums ir nepieciešami ātri telpiski vaicājumi ("kuri acu elementi atrodas šajā taisnstūrī").

Atvasināts siets

Iemesli, kāpēc mums vajag atvasinātu trīsstūra sietu:

  • acs struktūra kopumā var saturēt trīsstūrus, četrstūrus vai pat daudzstūrus ar lielāku virsotņu skaitu. Interpolācija uz formām, kas nav trijstūri, ir dārgāka / sarežģītāka, un, lai renderētu 3D formātā, mums jebkurā gadījumā ir jābūt trīsstūrveida sietam.
  • renderējot 1D elementus (malas), mums tie jāpārvērš četriniekos atbilstoši to biezumam (un četrinieki tiek pārvērsti par trijstūru pāri).
  • kad kartes CRS atšķiras no acu slāņa CRS, mums jāveic atkārtota atstumtība lidojuma laikā. Atvasinātu acu saglabāšana DRS kartē ļauj mums izvairīties no atkārtotas projektēšanas katrā renderēšanā.
  • detalizācijas pakāpe - veicot lielu laukumu, mēs varam veikt vienkāršošanu un renderēšanai izmantot mazāk trijstūru, mazākai platībai, iespējams, vēlēsimies sadalīt tādus elementus kā četrriteņus vairāk nekā divos trijstūros, lai iegūtu izcilāku kvalitāti.

Atvasinātais siets tiek saglabāts noteiktiem kartes iestatījumu parametriem (īpaši mērogam un DRS). Ikreiz, kad tiek mainīti kartes iestatījumi, atvasinātais siets ir jāderē. Pieņēmums ir tāds, ka bieži šie karšu iestatījumu parametri paliek nemainīgi vairāku renderēšanas zvanu laikā.

Tīkla slāņu ielāde būtu iespējama, izmantojot integrēto pārlūka paneli un / vai vienoto pievienošanas slāņa dialoglodziņu.

Kad acs slānis ir ielādēts, tam būs kartes slāņa rekvizītu dialoglodziņš, kas ir līdzīgs vektora / rastra slāņu dialoglodziņam, un renderētāja konfigurācija ir līdzīga iepriekšminētajiem GUI maketiem.


Skatīties video: QGIS Python PyQGIS - Access vector layer attributes