[Talk-cz] Tracer - nastavení
Jan Bilak
jan.bilak.osm na gmail.com
Sobota Únor 27 18:07:49 UTC 2010
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>
Další informace o konferenci talk-cz