Tracer - nastavení

11 zpráv
Zpět na přehled

Tracer - nastavení

11 zpráv JMP 3 účastníků 13 min čtení
  1. Jan Bilak jan.bilak.osm na gmail.com #md09629
    Ahoj, přidal jsem podporu nějakého nastavení TraceServeru: http://jabi.aspone.cz/osm/TraceServerBeta5.zip Zároveň podporuje pluginy pro předzpracování bitmapy i filtraci bodů (asi nejproblematičtější část trasování). Konfigurační soubor je ve formátu XML a definuje dvě pipelines (bitmapFilters a pointSetFilters). Tyto lze skládat z vestavených filtrů a pluginů. Pluginy ve formě tříd v Class Library musí referencovat Osm.Kn.Trace.Server.Interfaces.dll a implementovat jednoduché rozhraní IBitmapFilter nebo IPointSetFilter. Schema: http://jabi.aspone.cz/osm/PluginInterface.png Zároveň je třeba třídě přiřadit atribut BitmapFilterAttribut nebo PointSetFilterAttribute a kontruktoru přiřadit jméno, které se pak používá pro označení pluignu v konfiguračním souboru. Filtry mohou mít parametry, které lze nastavovat v konf. souboru. Jeden filtr může být v pipeline vícekrát (třeba i s různým nastavením). Hotové Class Libraries (jedna knihovna může obsahovat více filtrů) je třeba umístit do složky plugins, která leží ve složce, ve které je Osm.Kn.Trace.Server.exe a Osm.Kn.Trace.Server.Interfaces.dll. Pro pochopení, co který filtr dělá, doporučuji všechny následující filtry v pipeline zakomentovat a zkusit v JOSM, co z toho bude lézt. Při změně bitmapFilters je vhodné smazat cache soubory. Při změně pointSetFilters to není třeba. I bez tvorby nových pluignů je možné trasování ovlivňovat změnou pipeline (ubírám filtrů, změnou pořadí, přidávám filtrů, změnou parametrů, ...). Pomocí pluginů je možné část nebo celou pipeline nahradit. Honza Příklad konfiguráku: <?xml version="1.0" encoding="utf-8" ?> <config> <bitmapFilters> <!-- Zacelí drobné díry v čarách tím, že očerní všechny bílé body, které sousedí alespoň v jednom ze 4 základních směrech s černým bodem. --> <filter name="SmallHoleRemover" /> </bitmapFilters> <pointSetFilters> <!-- Najde body, ve kterých se křivka láme pomocí metodu obdobnou jako při hledání extrémů funkce pomocí derivace. Ostatní body vynechá. --> <filter name="FindExtrems"> <!-- Vzdálenost bodu, od kterého se počítají vzdálenosti bodů křivky, od objektu. --> <param name="dist" value="10000" /> <!-- Počet směrů, do kterých se výše zmíněný bod umisťuje. --> <param name="stepCount" value="27" /> </filter> <!-- Najde body A, B, C, kde |AB| a |BC| je větěí než minDistance a zároveň vzdálenost AC od B je menší než minDistance. V takovýchto případech vynechá B. --> <filter name="SimplifyPolyline"> <param name="minDistance" value="15" /> <param name="maxDistance" value="4" /> </filter> <!-- Najde body A, B, C, kde |AB| a |BC| je větěí než minDistance a zároveň vzdálenost AC od B je menší než minDistance. V takovýchto případech vynechá B. --> <filter name="SimplifyPolyline"> <param name="minDistance" value="3" /> <param name="maxDistance" value="1.3" /> </filter> <!-- Najde A, B, C, D takové, že - |AB| je větší než minOuterDist, - |CD| je větší než minOuterDist, - |BC| je menší než maxInnerDist, - úhel přímek AB a CD je větší než minAngle A pak BC vyhodí a nahradí průsečíkem AB a CD. Tedy vlastně eliminuje "kulaté" rohy. --> <filter name="FindVertexis"> <param name="maxInnerDist" value="15" /> <param name="minOuterDist" value="5" /> <param name="minAngle" value="30" /> <!-- Neprovádět, pokud je bod ke smazání dále než tolerance od přímky AB i CD. --> <param name="tolerance" value="3" /> <!-- Neprovádět, pokud je průsečík AB a CD dále než tolerance od bodu B nebo C. --> <param name="tolerance2" value="20" /> </filter> <!-- Najde po sobě jdoucí body A, B, C, vzdálenost AC od B je menší než tolerance. V takovýchto případech vynechá B. ??? --> <filter name="FilterPointGroups"> <param name="tolerance" value="2" /> </filter> <!-- Najde body vynechané, které jsou dále než maxDistance od upraveného polygonu. A vrátí je zpět.--> <filter name="AddMissingPoints"> <param name="maxDistance" value="4" /> </filter> <!-- Pokusí se polygon nafouknout tak, aby segmenty polygonu byly ve středu čáry. --> <filter name="LineWidthCorrection"> </filter> <!-- Najde body A, B, C, kde |AB| a |BC| je větěí než minDistance a zároveň vzdálenost AC od B je menší než minDistance. V takovýchto případech vynechá B. --> <filter name="SimplifyPolyline"> <param name="minDistance" value="5" /> <param name="maxDistance" value="1.3" /> </filter> <!-- Najde body A, B, C, kde |AB| a |BC| je větěí než minDistance a zároveň vzdálenost AC od B je menší než minDistance. V takovýchto případech vynechá B. --> <filter name="SimplifyPolyline"> <param name="minDistance" value="15" /> <param name="maxDistance" value="2" /> </filter> </pointSetFilters> <webServer> <!-- TCP port, na kterém server poslouchá. --> <endPoint port="5050" /> </webServer> <wms> <!-- Okolí bodu kliknutí ve stupních lon/lat, které se stahuje. Stáhne se tedy minimálně čtverec (2*size) x (2*size). --> <surroundingToDownload size="0.001" /> <!-- Jak moc tmavý bod musí být, aby byl považován za černý (0-255)? --> <threshold value="127" /> <!-- verticalSkip ... o kolik pixelů se dlaždice stáhne ve vertikálním směru větší a pak se ořízne (nahoře). Kvůli copyrightu. tileSize ....... velikost dlaždice ve stupních lon/lat. resolution ..... rozlišení dlaždice v px. --> <downloader verticalSkip="560" tileSize="0.002" resolution="1600" /> </wms> </config>
  2. MP singularita na gmail.com #mae268a
    Ahoj, přidal jsem podporu nějakého nastavení TraceServeru: http://jabi.aspone.cz/osm/TraceServerBeta5.zip
    Tak jsem to zkusil a nefunguje to, hází to jakousi exception kvůli nenalezenému filtru:
    <filter name="SmallHoleRemover" />
    Pokud tuhle řádku v defaultním konfiguráku nezakomentuju, hází mi to tuhle chybu: $ mono Osm.Kn.Trace.Server.exe EXPERIMENTALNI VERZE (2) Plugin dir is /m/e/p/josm/tracer/plugins. Plugin SmallHoleRemover.dll loaded. Unhandled Exception: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary. at System.Collections.Generic.Dictionary`2[System.String,System.Type].get_Item (System.String key) [0x00000] at Osm.Kn.Trace.Server.Wms.BitmapFilterManager.AddFilter (System.String name, IDictionary`2 parameters) [0x00000] at Osm.Kn.Trace.Server.Config.LoadBitmapFilters () [0x00000] at Osm.Kn.Trace.Server.Server.Start () [0x00000] at Osm.Kn.Trace.Server.Program.Main (System.String[] args) [0x00000] Bez téhle řádky to sice jde spustit, ale pak to hází tuhle chybu: - trace/simple/50.10415000432744;14.36878225455269 http://wms.cuzk.cz/wms.asp?service=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4326&FORMAT=image/pn g&LAYERS=kn&BBOX=14.3660,50.1040,14.3680,50.1067&WIDTH=1600&HEIGHT=2160 System.NullReferenceException: Object reference not set to an instance of an object at Osm.Kn.Trace.Server.Config.get_Treshold () [0x00000] at Osm.Kn.Trace.Server.Wms.TileDownloader.Download (Osm.Kn.Trace.Server.Wms.Tile tile) [0x00000 ] at Osm.Kn.Trace.Server.Wms.TileDownloader.Get (Osm.Kn.Trace.Server.Wms.Tile tile) [0x00000] at Osm.Kn.Trace.Server.Server.CreateBitmap (Osm.Kn.Trace.Server.Wms.Tile[,] tiles, Int32 resolution) [0x00000] at Osm.Kn.Trace.Server.Server.TraceCommand (PointGeo point, IExporter exporter) [0x00000] at Osm.Kn.Trace.Server.Server.webServer_GetContent (System.Object sender, Osm.Kn.Trace.Server.WebServer.GetDataEventArgs e) [0x00000] ... takže ta nová verze vlastně nefunguje .... Martin
  3. Jan Bilak jan.bilak.osm na gmail.com #mab9243
    Ahoj, díky za reakci ... zítra (nebo možná ještě teď večer) se kouknu, v čem je problém. Mimochodem zkoušíš to na Windows nebo pod Monem? Honza
  4. Jan Bilak jan.bilak.osm na gmail.com #m959a8e
    Ahoj, omlouvám se za chyby ... opravenou verzi jsem dal na stejné místo. Honza 2010/2/28 Jan Bilak <jan.bilak.osm na gmail.com>:
  5. MP singularita na gmail.com #m9049d1
    Ahoj, díky za reakci ... zítra (nebo možná ještě teď večer) se kouknu, v čem je problém. Mimochodem zkoušíš to na Windows nebo pod Monem?
    Pod monem, Windows tu ani nemám. Nová verze už funguje, SmallHoleRemover trochu pomáhá, ale na většinu budov pořád nestačí. Ale snad časem vznikne nějaký lepší filtr. Možná bych mohl mrknout do zdrojáků a něco vymyslet :) Martin
  6. Jan Bilak jan.bilak.osm na gmail.com #m6d6e07
    Zdroják SmallHoleRemover filtru vypadá takto: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Osm.Kn.Trace.Server.Trace.Interfaces; namespace SmallHoleRemover { [BitmapFilter("SmallHoleRemover")] public class SmallHoleRemover : IBitmapFilter { const byte BACKGROUND = 0; const byte PEN = 1; const byte TEMP = 2; #region IBitmapFilter Members public byte[][] Filter(byte[][] bitmap) { int h = bitmap.Length; int w = bitmap[0].Length; for (int y = 1; y < h - 1; y++) { for (int x = 1; x < w - 1; x++) { if ((bitmap[y][x] == PEN) && (bitmap[y][x - 1] != BACKGROUND || bitmap[y][x + 1] != BACKGROUND || bitmap[y - 1][x] != BACKGROUND || bitmap[y + 1][x] != BACKGROUND)) bitmap[y][x] = TEMP; } } for (int y = 1; y < h - 1; y++) { for (int x = 1; x < w - 1; x++) { if (bitmap[y][x] == TEMP) bitmap[y][x] = PEN; } } return bitmap; } #endregion #region IConfigurable Members public void Init(IDictionary<string, string> confValues) { } #endregion } }
  7. Petr Dlouhý petr.dlouhy na email.cz #m4d4ad2
    Ahoj, zkoušel jsem tu novou verzi, která opravdu funguje zase o dost lépe. Zdá se ale, že to na tenkých čarách stále moc nefunguje - většinou to stejně projde nějakou mezerou. Dá se někde nastavit, jak velkou mezeru to zacelí? On Mon, 01 Mar 2010 13:32:21 +0100, Jan Bilak <jan.bilak.osm na gmail.com>
  8. Jan Bilak jan.bilak.osm na gmail.com #m3ca4a0
    Ahoj, to se divím, že funguje o dost lépe, protože tam prakticky žádné změny v tomto směru nejsou. Změny se týkají možnosti nastavení a pluginů (filtrů). Pravda je, že jeden ukázkový primitivní filtr SmallHoleRemover, jehož zdroják jsem zde posílal, zaceluje malé díry a tak může někde přinést lepší výsledky (někde zase horší, pokud jsou čáry už tak dost tlusté). Ten plugin nemá žádné nastavení. Když se koukneš do toho zdrojáku (je velmi krátký a zřejmý), tak zjistíš, že natvrdo obarvuje bílé body, které na jedné ze 4 základních stran sousedí s černým pixelem. Stačí tuto podmínku upravit nebo filtr udělat konfigurovatelný... a může se to chovat jinak. Nebo prostě udělat jiný filtr ... tvorba filtru je jednoduchá věc, stačí referencovat jednu Class Library a implementovat jednoduché rozlišení. Výsledné DLL dát do adresáře plugins a přidat filtr v konfiguráku na vhodné místo Případně "hrubou silou" lze v konfiguráku aplikovat stejný filtr třeba 2x za sebou. Tím se také zacelí trochu větší díry (ale není to moc pěkné řešení). <bitmapFilters> <filter name="SmallHoleRemover" /> <filter name="SmallHoleRemover" /> </bitmapFilters> Honza 2010/3/1 Petr Dlouhý <petr.dlouhy na email.cz>:
  9. Petr Dlouhý petr.dlouhy na email.cz #m3625fe
    Ahoj, tím funguje lépe jsem myslel v jiných směrech - například často správně ignoruje nesouvisející čáry zasahující do trasovaného objektu. Myslel jsem, že SmallHoleRemover má problém tenkých čar řešit. Mimochodem: v Traceru jsou stále některé otravné chyby z dřívějška - občas trasovaná oblast vůbec neobsahuje bod, na který jsem kliknul; někdy "vystřelují" body z objektu daleko za jeho hranici; občas hlásí "IndexOutOfRangeException". On Mon, 01 Mar 2010 18:13:33 +0100, Jan Bilak <jan.bilak.osm na gmail.com>
    Ahoj, to se divím, že funguje o dost lépe, protože tam prakticky žádné změny v tomto směru nejsou. Změny se týkají možnosti nastavení a pluginů (filtrů). Pravda je, že jeden ukázkový primitivní filtr SmallHoleRemover, jehož zdroják jsem zde posílal, zaceluje malé díry a tak může někde přinést lepší výsledky (někde zase horší, pokud jsou čáry už tak dost tlusté). Ten plugin nemá žádné nastavení. Když se koukneš do toho zdrojáku (je velmi krátký a zřejmý), tak zjistíš, že natvrdo obarvuje bílé body, které na jedné ze 4 základních stran sousedí s černým pixelem. Stačí tuto podmínku upravit nebo filtr udělat konfigurovatelný... a může se to chovat jinak. Nebo prostě udělat jiný filtr ... tvorba filtru je jednoduchá věc, stačí referencovat jednu Class Library a implementovat jednoduché rozlišení. Výsledné DLL dát do adresáře plugins a přidat filtr v konfiguráku na vhodné místo Případně "hrubou silou" lze v konfiguráku aplikovat stejný filtr třeba 2x za sebou. Tím se také zacelí trochu větší díry (ale není to moc pěkné řešení). <bitmapFilters> <filter name="SmallHoleRemover" /> <filter name="SmallHoleRemover" /> </bitmapFilters> Honza 2010/3/1 Petr Dlouhý <petr.dlouhy na email.cz>:
    Ahoj, zkoušel jsem tu novou verzi, která opravdu funguje zase o dost lépe. Zdá se ale, že to na tenkých čarách stále moc nefunguje - většinou to stejně projde nějakou mezerou. Dá se někde nastavit, jak velkou mezeru to zacelí? On Mon, 01 Mar 2010 13:32:21 +0100, Jan Bilak <jan.bilak.osm na gmail.com>
    Zdroják SmallHoleRemover filtru vypadá takto: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Osm.Kn.Trace.Server.Trace.Interfaces; namespace SmallHoleRemover { [BitmapFilter("SmallHoleRemover")] public class SmallHoleRemover : IBitmapFilter { const byte BACKGROUND = 0; const byte PEN = 1; const byte TEMP = 2; #region IBitmapFilter Members public byte[][] Filter(byte[][] bitmap) { int h = bitmap.Length; int w = bitmap[0].Length; for (int y = 1; y < h - 1; y++) { for (int x = 1; x < w - 1; x++) { if ((bitmap[y][x] == PEN) && (bitmap[y][x - 1] != BACKGROUND || bitmap[y][x + 1] != BACKGROUND || bitmap[y - 1][x] != BACKGROUND || bitmap[y + 1][x] != BACKGROUND)) bitmap[y][x] = TEMP; } } for (int y = 1; y < h - 1; y++) { for (int x = 1; x < w - 1; x++) { if (bitmap[y][x] == TEMP) bitmap[y][x] = PEN; } } return bitmap; } #endregion #region IConfigurable Members public void Init(IDictionary<string, string> confValues) { } #endregion } }
    -- Petr Dlouhý
  10. Jan Bilak jan.bilak.osm na gmail.com #m6a90a1
    Ahoj. SmallHoleRemover je spíše ukázkový filtr, než filtr, který by to opravdu dobře řešil. V rámci úpravy traceserveru tak, aby byl konfigovatelný, jsem se rozhodl vytvořit dva typy filtrů. Jeden typ umí pozměnit černobílou bitmapu (a tedy např. lze pomocí takového typu filtru zacelovat díry). Druhý typ filtru pak slouží k redukci (případně i přidání) bodů na obrysu trasovaného domu. Filtrů druhého typu existuje v programu několik a tvoří to podstatnou část traceserveru. Na vstupu je množina bodů tvořící vnější obrys oblasti vyplnění floodfillem. Pak tato množina projde sadou filtrů a výsledek posledního filtru je už vlastně konečný výsledek (jen se přepočtou souřadnice apod.). Přitom typy filtrů, jejich pořadí a nastavení je výsledek nějakých pokusů zejména na jednom typy mapového podkladu. Věřím, že lze zde dosáhnout i lepších výsledků - zejména v jiných oblastech mapy, než kde jsem to zkoušel. Filtr prvního typu ale žádný neexistoval a SmallHoleRemover je vlastně takový ukázkový filtr (zacelí opravdu jen malé díry a tak jeho praktický použití je dosti omezené, ale zase to názorná ukázka, jak takový filtr vytvořit). Konfigurací pak lze ovlivnit, které filtry se použijí, v jakém pořadí a s jakým nastavením filtru (pokud filtr nějaké nastavení podporuje). Nyní si tedy každý (.NET programátor) může vytvářet vlastní filtry a konfiguraci podle oblasti, kterou trasuje nebo osobních preferencí. Shrnuto: Tato verze si nekladla za cíl lepší rozpoznávání nebo opravu nějakých chyb. Cílem bylo zavedení konfigurovatelnosti, kterou ocení třeba někteří vývojáři nebo pokročilejší uživatelé. Honza 2010/3/1 Petr Dlouhý <petr.dlouhy na email.cz>:
  11. MP singularita na gmail.com #m0171cb
    SmallHoleRemover je spíše ukázkový filtr, než filtr, který by to opravdu dobře řešil. V rámci úpravy traceserveru tak, aby byl konfigovatelný, jsem se rozhodl vytvořit dva typy filtrů. Jeden typ umí pozměnit černobílou bitmapu (a tedy např. lze pomocí takového typu filtru zacelovat díry). Druhý typ filtru pak slouží k redukci (případně i přidání) bodů na obrysu trasovaného domu.
    Napsal jsem LargeHoleRemover, ten v podstate provede dilataci strukturnim elementem NxN, kde N je od 2 do 15 (default 4). Slozitost ma vzhledem k N linearni. Je to v priloze (zdrojak + Makefile + binarka + README), na tenkostenny katastr to funguje dobre (odzkouseno :), nicmene na katastr se silnejsimi stenami to funguje o neco hure a obcas nespojuje budovy (protoze steny jsou pak moc tluste ...) Takze to bohuzel znamena nutnost prepinat konfiguraci, na "normalnim" katastru nechat starou konfiguraci, na tenkostenem pridat tenhle filtr (viz. README) Mozna by pak stalo za to dat moznost konfiguraci prepinat nejak za behu, ale jelikoz po prepnuti konfigurace to stejne chce promazat *.kn soubory, tak by to vlastne ani moc nepomohlo. Napadla mne ale moznost, jak to prepinani usnadnit upravou traceru: 1) V config.xml by se dal specifikovat adresar, kam si tracer uklada .kn soubory. 2) Tracer by na commandline mohl brat jako argument jmeno konfiguraku ktery ma pouzit Potom by slo vytvorit treba config-tenkostenny.xml a config-normalni.xml, v kazdem definovat vlastni adresar na .kn soubory. Pak by stacilo jen pri prechodu na druhy typ katastru tracer stopnout a spustit znovu s druhym konfigurakem bez nutnosti mazani cache. Navic pak by sel napsat skript ve stylu "while (true) {tracer tenkostenny;tracer tlustostenny}" a pak ESC v okne s tracerem prepina mezi konfiguracemi a zavreni okna ukoncuje tracer :) Martin
Napsat odpověď e-mailem… Odpovědět

Otevře váš e-mailový klient. Odpovědi pak sledujte zde na webu.