praegune kellaaeg 21.05.2024 19:24:51
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
iFlop
Kreisi kasutaja
liitunud: 03.05.2003
|
|
Kommentaarid: 66 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
65 |
|
tagasi üles |
|
|
infidel
HV kasutaja
liitunud: 31.01.2004
|
07.11.2022 16:32:44
|
|
|
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 |
|
|
kalvis
Kreisi kasutaja
liitunud: 20.10.2009
|
08.11.2022 11:53:13
|
|
|
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 |
|
|
iFlop
Kreisi kasutaja
liitunud: 03.05.2003
|
08.11.2022 15:16:37
|
|
|
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
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
|
|
Kommentaarid: 66 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
65 |
|
tagasi üles |
|
|
infidel
HV kasutaja
liitunud: 31.01.2004
|
08.11.2022 15:55:31
|
|
|
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 |
|
|
iFlop
Kreisi kasutaja
liitunud: 03.05.2003
|
09.11.2022 18:44:13
|
|
|
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
Nüüd vaatasin, et QGISis saab sama moodi line-stringidest buffer abiga polügone teha
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 |
|
|
ref
Kreisi kasutaja
liitunud: 10.08.2003
|
28.11.2022 16:14:05
|
|
|
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
|
|
Kommentaarid: 17 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
15 |
|
tagasi üles |
|
|
iFlop
Kreisi kasutaja
liitunud: 03.05.2003
|
28.11.2022 21:52:20
|
|
|
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 |
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
|
|
Kommentaarid: 66 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
65 |
|
tagasi üles |
|
|
|
lisa lemmikuks |
|
|
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.
|