Vairāk

Vai ir iespējams mainīt ģeometriju, neuzsākot slāņa rediģēšanu

Vai ir iespējams mainīt ģeometriju, neuzsākot slāņa rediģēšanu


Es strādāju c ++ / QT 4.5 ar QGis 2.8.2 API. Man katru sekundi bija jāmaina pazīmju ģeometrija slānī. Katru otro jauno informāciju iegūst no Ethernet savienojuma, lietojumprogramma iegūst datus un izsauc funkciju ar parametriem.

Tas izskatās kā reālā laika izsekotājs. Tas darbojas tikai tad, ja es ielikulLayer-> startEditingunlLayer-> commChangesbet tas bija pārāk lēns.

Šeit ir mans kods (tikai izraksts. Pilnīgs kods ir pārāk garš ziņai.)

QgsVectorLayer * lLayer = mMapLayer.value (TRACKS); lLayer-> startEditing (); QgsVectorDataProvider * lDataProvider; lDataProvider = lLayer-> dataProvider (); // aprēķiniet jaunu nejaušu X un Y PosX = (qrand ()% (Xmax-Xmin) + Xmin); PosY = (qrand ()% (Ymin-Ymax) + Ymax); // izveidot punktu QgsGeometry * MyPoint; MyPoint = QgsGeometry :: fromPoint (QgsPoint (PosX, PosY)); QgsGeometryMap MyGeometryMap; // iegūt norādīta Id QgsFeatureIterator MyFeatIter funkciju; MyFeatIter = lDataProvider-> getFeatures (); QgsFeature MyFeature; QgsFeatureId MyFeatureId; while (MyFeatIter.nextFeature (MyFeature)) {if (pTrackId == MyFeature.attribute ("TrackId")) {MyFeatureId = MyFeature.id (); MyFeature.setGeometry (* MyPoint); MyFeature.setAttribute (garums, PosY); MyFeature.setAttribute (Latitude, PosX); }} MyGeometryMap.insert (MyFeatureId, * MyPoint); bool lRezultāts; lResult = lDataProvider-> changeGeometryValues ​​(MyGeometryMap); lLayer-> veiktChanges ();

Arsākt rediģētuncommChangestas darbojas, bet ļoti lēni. Bezsākt rediģētuncommChanges, šķiet, ka koordinātas ir modificētas, bet slānī funkcija nepārvietojas.


Datu nodrošinātājs pret vektoru slāni

Vektoru slānim ir datu nodrošinātājs, kurš (parasti [1]) tiek izmantots, lai pastāvīgi saglabātu datus.

Ja jūs kaut ko rediģējat slānī ar parasto rediģēšanas sesiju, jūsu izmaiņas tiks saglabātas vektora slānī, līdz jūs tās izdarīsit, pēc tam tās tiks nosūtītas datu nodrošinātājam.

Rediģēt sesijas

Jūsu piemērā jūs sākat rediģēšanas sesiju slānī, bet pēc tam rakstāt tieši datu sniedzējam. Tā vietā jums vajadzētu vai nu

  • Nelietojiet rediģēšanas sesiju un izmantojiet tikai QgsDataProvider (lDataProvider)

    Darbam tieši pie datu sniedzēja ir ievērojams trūkums, ka uz audekla (un citām lietojumprogrammas daļām) netiek nosūtīts signāls par to, ka dati ir mainījušies. Tāpēc ikreiz, kad izmantojat pieeju, tieši rakstot datu sniedzējam, jūs uzņematies atbildību par izmaiņu signalizēšanu visās ietekmētajās lietojumprogrammas daļās, kuras varētu būt ieinteresētas saņemt paziņojumu par šīm izmaiņām.

  • Strādājiet ar rediģēšanas sesijām un nekad nelietojietlDataProviderbet QgsVectorLayer (slānis) vietā

    QgsVectorLayer ir piemērotas metodes, lai iegūtu funkciju iteratoru, mainītu ģeometriju vai atribūtus un pats dzēstu vai pievienotu funkcijas, un raidīs signālus par mainītiem datiem, uz kuriem ieinteresētās personas (piemēram, kartes audekls vai atribūtu tabula) var abonēt un reaģēt.

Izrāde

IzrādecommChangesnosaka datu sniedzējs, kuru slānis izmanto (un to veikšanai nepieciešamo darbību skaits / sarežģītība).

Ja esat apmierināts ar animētu audeklu un jums nav nepieciešama pastāvīga krātuve, varat izmantot atmiņas nodrošinātāju vai vienkārši neveikt izmaiņas (tāpēc tās tiks atveidotas no rediģēšanas bufera).

Ja jums ir nepieciešama pastāvīga krātuve, pārliecinieties, ka esat izvēlējies labu datu nodrošinātāju un vai jums ir atbilstoši I / O resursi (tīkls, disks ...).

Qt versija

Lūdzu, atjauniniet uz Qt 4.8

[1] Atmiņas slānis ir izņēmums


Skatīties video: Тачка, Права, Раван