Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Abi lihtsa GIS probleemiga märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 07.11.2022 12:46:53 Abi lihtsa GIS probleemiga vasta tsitaadiga

Kas siin foorumis on kedagi, kes on geoinfosüsteemidega kokku puutunud? Probleemi püstitus on järgnev - sisendiks on suur hunnik gps logisid. Kokku üle 10 miljoni punktiga. Väljundiks soovin saada kõiki punkte ümbritsevat välist joont ehk outer boundary'it.

Genereerisin ühe näide ka - sisendiks 3 gps tracki:
Spoiler Spoiler Spoiler

Soovitud väljund peaks olema selline:

Spoiler Spoiler Spoiler

Siin see näide ka visuaalselt google kaardil:
https://www.google.com/maps/d/viewer?mid=1D6-xS5NIHenCyXkAoW_bkq_L1EjLW6k

Mõned mõtted:

1) Üks variant oleks vastav programm algusest lõpuni ise valmis kirjutada. Üldine arusaam, kuidas seda probleemi lahendada saaks, on mul olemas, aga see on sellist tüüpi probleem, kus tõenäoliselt ei ole vaja hakata ise jalgratast leiutama icon_smile.gif

2) QGIS - selle vabavaralise programmiga olen pisut mänginud, aga ühtegi vähegi keerukamat asja ma seal teha ei oska.

3) PostgreSQL + PostGIS - alles praegu hakkasin seda uurima. Esmapilgul on tundub see vist kõige mõistlikum suund. Kui just QGISis selle probleemi lahendus päris triviaalne ei ole.
Kommentaarid: 66 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 65
tagasi üles
vaata kasutaja infot saada privaatsõnum
infidel
HV kasutaja
infidel

liitunud: 31.01.2004



Autoriseeritud ID-kaardiga

sõnum 07.11.2022 16:32:44 vasta tsitaadiga

QGISis pead natuke käsitööd selle jaoks tegema või Pythonis veidi juurde kirjutama.
PostGISiga on lahendus täielikult automatiseeritav. Saab kasutada näiteks https://postgis.net/docs/ST_ConcaveHull.html funktsiooni. Samas võib ka näiteks võtta jooned ST_Collect abil kokku, ST_Buffer abil pinnaks ja siis ST_ExteriorRing abil välimine joon.

Mis kujul väljund peaks olema? Kas samuti GPX või midagi muud?
Kommentaarid: 35 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum
kalvis
Kreisi kasutaja

liitunud: 20.10.2009




sõnum 08.11.2022 11:53:13 vasta tsitaadiga

Mul oli vastupidi vaja seespool ala leida punktid. Paraku oli tööandjal võimas GIS süsteem - seal oli selline päring olemas ja genereeris tavalise CSV faili. Paraku on selline asi GIS süsteemi enda põhine. Väliselt saab teoorias exceli makrodega teha kui koordinaadid teisendada X ja Y väärtusteks. Paraku tuleb ala jagada kolmnurkadeks ja teha IF käsuga - kas on mõnes kolmnurga sees või mitte ja suht triviaalne ülesanne. Netis on vastavad kolnurga sees või väljas algoritmid olemas aga tegu on paraja pähkliga ja üksjagu arvutusvõimsust (ühe kolnurga sees on vaja lahendada 3 võrranditingimust - ruudud, ruutjuured jne.)
Hulknurga puhul saab siiski kasutada üht lihtsustust (see oli üks meetod ka kolmnurkade lahendusviisis) sirgete võrranditekontroll kas on väljapool või seespool. Iga hulknurga külg on sirge võrrand ja kontrollitakse punkti asumist väljapool sirget ja tuleb kontrollida kõik sirged ära. See toimib hästi kui ala on nagu ring. kui ei ole siis tuleb hulknurk jagada osahulknurkadeks, et oleksid ringilaadsed.
Teoorias üks lihtsamaid meetodeid on ringidega - teed miinimumringi ja teed maksimum ringi. Miinimumringi sees olevad punktid on kõik valed. Maksimumringist väljapool on kõik õiged. Kahe ringi vahel olevad punktid on hall ala ja need teed käsitsi.
tagasi üles
vaata kasutaja infot saada privaatsõnum
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 08.11.2022 15:16:37 vasta tsitaadiga

infidel, Tänud kaasa mõtlemast! Esialgu proovisin PostGISi nende samade testandmetega. ST_ConcaveHull puhul tundus, et jooni, või õigemini seda, kuidas punktide vahel liiguti, ignoreeritakse ning tulemus arvutatakse lihtsalt kõikide punktide järgi. See mulle kahjuks ei sobi.

Aga ST_ExteriorRing + ST_Buffer + ST_Collect kombo toimib ideaalselt thumbs_up.gif
Lisaks joonistatakse 1m raadius ka juurde, mis mulle pigem meeldib.

Mõlemad väljundid lisasin samale kaardile:
https://www.google.com/maps/d/viewer?mid=1D6-xS5NIHenCyXkAoW_bkq_L1EjLW6k

Eks näis kuidas see päris andmetega toimib. Mis väljundisse puutub, siis igasugune tekstikujuline koordinaatide jada sobib. Hetke päring oli selline, kus iga track on LINESTRING:

SELECT ST_AsText(ST_ExteriorRing(ST_Buffer(ST_Collect(track::geometry)::geography, 1)::geometry))


kalvis, Olen Excelis igasuguseid asju teinud... Aga kui on vaja toimetada üle 10 miljoni punktiga, siis eelistaksin sobivamaid vahendeid kasutada icon_smile.gif
Kommentaarid: 66 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 65
tagasi üles
vaata kasutaja infot saada privaatsõnum
infidel
HV kasutaja
infidel

liitunud: 31.01.2004



Autoriseeritud ID-kaardiga

sõnum 08.11.2022 15:55:31 vasta tsitaadiga

ST_ConcaveHull puhul on oluline teine parameeter (pctconvex) - kui palju tulemust siledamaks tõmmatakse.
Selle asemel, et joont tüüpide geometry ja geography vahel konverteerida, võiks ta kohe sellisele kujule (nt geography või siis Eesti koordinaatsüsteemis geometry, SRID=3301) panna, mis meetriga kaugusi lubab. Nii käib arvutus veidi ressursisäästlikumalt.
Väljundina võid kasutada ST_AsKML, siis tõstab kohe Google kaardile sobivale kujule. Või siis talletada tulemus tabelina, QGIS suudab neid kenasti näidata.
Kommentaarid: 35 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 09.11.2022 18:44:13 vasta tsitaadiga

Liigutasin päris andmed baasi ning ST_ExteriorRing + ST_Buffer + ST_Collect kombo töötas ilusti ühe väikse andmeseti peal. Aga see põhiline andmesest, kuhu jäi üle 9 miljonit punkti, mis jaotatud ~1400 linestringi peale, sellest midagi välja ei tulnud. Päring tahtis liiga palju mälu saada.

Järgmisena proovisin seda, et tegin igast line-stringist polügoni, kasutades seda sama kombot + lihtsustamine ning salvestasin selle baasi. Mingi hetk liikusin juba QGISi ning sealt edasi Dissolve + Delete holes + Multipart to singleparts (sest algandmetes jäi ikkagi mingit jura sisse) + Polygons to lines ja lõpuks gpx export. Tulemuseks täpselt see, mida soovisin icon_cool.gif

Nüüd vaatasin, et QGISis saab sama moodi line-stringidest buffer abiga polügone teha icon_smile.gif
Samas see PostGIS ja QGISi kombo ongi antud juhul kõige mõistlikum. Seda välisjoone tulemit võiks ehk paar korda aastas uuendata ning kui lähteandmed baasis, saab QGISis neid ka teistel viisidel visualiseerida.

infidel, tänud veelkord kaasa mõtlemast!
Kommentaarid: 66 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 65
tagasi üles
vaata kasutaja infot saada privaatsõnum
ref
Kreisi kasutaja

liitunud: 10.08.2003




sõnum 28.11.2022 16:14:05 vasta tsitaadiga

iFlop kirjutas:
Liigutasin päris andmed baasi ning ST_ExteriorRing + ST_Buffer + ST_Collect kombo töötas ilusti ühe väikse andmeseti peal. Aga see põhiline andmesest, kuhu jäi üle 9 miljonit punkti, mis jaotatud ~1400 linestringi peale, sellest midagi välja ei tulnud. Päring tahtis liiga palju mälu saada.

Ma eeldan, et sul on vaikimisi postgre konf? Seal on workmem väärtus selline, et "töötaks ka kehva android telefoni peal", seega - kui vajadust suuremaid päringuid jooksutada ja veidi mootorit optimeerida võid alustada kõige elementaarsematest parameetritest. On selline abiskript mis võiks olla heaks alguseks - https://pgtune.leopard.in.ua/ (ja sealt edasi kannatab ka juba muid asju torkida - https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server).

See "üle 9 miljonit punkti, mis jaotatud ~1400 linestringi peale" ei ole teps mitte suur hulk andmeid icon_smile.gif
Kommentaarid: 17 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 15
tagasi üles
vaata kasutaja infot saada privaatsõnum
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 28.11.2022 21:52:20 vasta tsitaadiga

ref, jah, vaikimisi seadistus. Masinas 16GB mälu ning antud Postgre päring tiksus üle poole tunni enne kui selle ise ära lõpetasin. Selle aja jooksul sõi päring kogu arvuti mälu ära ning lisaks swappis päris korralikult SSD'le. Aga järgmisel korral vaatan kindlasti mälu seadistuse üle ja proovin veel.
Aga õnneks olen nüüd QGISi piisavalt kasutanud ja saan selle programmi loogikale pihta. Lõpptulemuse saamiseks on ikkagi vaja veidi käsitööd teha ning QGIS tundub selleks sobivam, kuigi eks seda saaks ka otse andmebaasis teha.

ref kirjutas:
See "üle 9 miljonit punkti, mis jaotatud ~1400 linestringi peale" ei ole teps mitte suur hulk andmeid icon_smile.gif

Nõus, aga kui nendega punktidega ebaefektiivselt toimetada, on see maht piisav, et vanem arvuti sellega hätta jääks. Isegi QGIS ja dissolve suutis samade andmetega ikalduda. Ühel juhul sai vist paari minutiga hakkama, aga teisel juhul pani lihtsalt järjekindlalt pange. Aga õnneks on nüüd väline joon olemas, mille abil saan lähteandmetest välja filtreerida jooned, mis välise joonega kokku ei puutu.

Siin ka lõplik väljund, mis tegelikult üllatavalt väike. Lihtsustades ainult ~100 000 punkti:
Spoiler Spoiler Spoiler
Kommentaarid: 66 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 65
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Abi lihtsa GIS probleemiga
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.