[Talk-cz] Tracer - nastavení
Vlákno 27.2. - 5.3.2010, počet zpráv: 11
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>
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
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
>
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
>>
>
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
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
}
}
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ý
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
>
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ý
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
>
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