« zpět na výpis měsíce |

[Talk-cz] Tracer - nastavení

Vlákno 27.2. - 5.3.2010, počet zpráv: 11


27.2.2010 07:07:49 (#1)
gravatar

Jan Bilak

<jan.bilak.osm at gmail.com>
151
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>

28.2.2010 02:21:34 (#2)
gravatar

MP

<singularita at gmail.com>
306
On 27/02/2010, Jan Bilak <jan.bilak.osm na gmail.com> wrote: zobrazit citaci
> 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: zobrazit citaci
> <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

28.2.2010 02:24:39 (#3)
gravatar

Jan Bilak

<jan.bilak.osm at gmail.com>
151
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 Dne 28. února 2010 2:21 MP <singularita na gmail.com> napsal(a): zobrazit citaci
> On 27/02/2010, Jan Bilak <jan.bilak.osm na gmail.com> wrote: >> 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 > > _______________________________________________ > Talk-cz mailing list > Talk-cz na openstreetmap.org > http://lists.openstreetmap.org/listinfo/talk-cz >

28.2.2010 01:33:15 (#4)
gravatar

Jan Bilak

<jan.bilak.osm at gmail.com>
151
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>: zobrazit citaci
> 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 > > > Dne 28. února 2010 2:21 MP <singularita na gmail.com> napsal(a): >> On 27/02/2010, Jan Bilak <jan.bilak.osm na gmail.com> wrote: >>> 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 >> >> _______________________________________________ >> Talk-cz mailing list >> Talk-cz na openstreetmap.org >> http://lists.openstreetmap.org/listinfo/talk-cz >> >

1.3.2010 05:08:38 (#5)
gravatar

MP

<singularita at gmail.com>
306
On 28/02/2010, Jan Bilak <jan.bilak.osm na gmail.com> wrote: zobrazit citaci
> 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

1.3.2010 01:32:21 (#6)
gravatar

Jan Bilak

<jan.bilak.osm at gmail.com>
151
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 } }

1.3.2010 06:04:38 (#7)
gravatar

Petr Dlouhý

<petr.dlouhy at email.cz>
607
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> wrote: zobrazit citaci
> 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 > } > } > > _______________________________________________ > Talk-cz mailing list > Talk-cz na openstreetmap.org > http://lists.openstreetmap.org/listinfo/talk-cz
-- Petr Dlouhý

1.3.2010 06:13:33 (#8)
gravatar

Jan Bilak

<jan.bilak.osm at gmail.com>
151
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>: zobrazit citaci
> 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> > wrote: > >> 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 >>     } >> } >> >> _______________________________________________ >> Talk-cz mailing list >> Talk-cz na openstreetmap.org >> http://lists.openstreetmap.org/listinfo/talk-cz > > > -- > Petr Dlouhý > > _______________________________________________ > Talk-cz mailing list > Talk-cz na openstreetmap.org > http://lists.openstreetmap.org/listinfo/talk-cz >

1.3.2010 06:39:38 (#9)
gravatar

Petr Dlouhý

<petr.dlouhy at email.cz>
607
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> wrote: zobrazit citaci
> 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> >> wrote: >> >>> 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 >>> } >>> } >>> >>> _______________________________________________ >>> Talk-cz mailing list >>> Talk-cz na openstreetmap.org >>> http://lists.openstreetmap.org/listinfo/talk-cz >> >> >> -- >> Petr Dlouhý >> >> _______________________________________________ >> Talk-cz mailing list >> Talk-cz na openstreetmap.org >> http://lists.openstreetmap.org/listinfo/talk-cz >> > > _______________________________________________ > Talk-cz mailing list > Talk-cz na openstreetmap.org > http://lists.openstreetmap.org/listinfo/talk-cz
-- Petr Dlouhý

1.3.2010 07:12:25 (#10)
gravatar

Jan Bilak

<jan.bilak.osm at gmail.com>
151
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>: zobrazit citaci
> 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> > wrote: > >> 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> >>> wrote: >>> >>>> 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 >>>>     } >>>> } >>>> >>>> _______________________________________________ >>>> Talk-cz mailing list >>>> Talk-cz na openstreetmap.org >>>> http://lists.openstreetmap.org/listinfo/talk-cz >>> >>> >>> -- >>> Petr Dlouhý >>> >>> _______________________________________________ >>> Talk-cz mailing list >>> Talk-cz na openstreetmap.org >>> http://lists.openstreetmap.org/listinfo/talk-cz >>> >> >> _______________________________________________ >> Talk-cz mailing list >> Talk-cz na openstreetmap.org >> http://lists.openstreetmap.org/listinfo/talk-cz > > > -- > Petr Dlouhý > > _______________________________________________ > Talk-cz mailing list > Talk-cz na openstreetmap.org > http://lists.openstreetmap.org/listinfo/talk-cz >

5.3.2010 05:08:48 (#11)
gravatar

MP

<singularita at gmail.com>
306
zobrazit citaci
> 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 ------------- další část --------------- A non-text attachment was scrubbed... Name: largehole.zip Type: application/zip Size: 2754 bytes Desc: [žádný popis není k dispozici] URL: <https://lists.openstreetmap.org/pipermail/talk-cz/attachments/20100305/b2ab8d51/attachment.zip>

« zpět na výpis měsíce