Używam samodzielnego GeoWebCache do obsługi kafelków ze zdalnego GeoServera. Mój problem polega na tym, że etykieta wielokąta jest dodawana do każdego z obsługiwanych kafelków, zamiast tylko raz w centroidie wielokąta.
Znalazłem post omawiający problem:
http://osgeo-org.1560.n6.nabble.com/polygon-label-repeated-for-each-tile-td4995203.html
Pierwsza odpowiedź wspomniała o możliwym rozwiązaniu:
„Podsumowując, proponuję użyć silnika renderowania kafelków (GeoWebCache, MapProxy, TileCache), zamiast żądać małego obrazu od GeoServer i pozwolić silnikowi renderowania kafelków wykonać później krojenie kafelków. Prześlesz mniej zapytań do GeoServer 1 duży obraz zamiast wielu małych obrazów), co przyspiesza całkowity czas tworzenia pamięci podręcznej kafelków. ”
Problem polega na tym, że nie mogłem tego zrobić, odwołując się do dokumentacji GeoWebCache, a wyżej wspomniany post nie wyjaśnia, jak to zaimplementować.
Znalazłem również post z odpowiedzią, która prowadzi do dokumentacji „kafelkowej” GeoWebCache , ale mój kod już używa wszystkich niezbędnych atrybutów, a mimo to etykieta wyświetla się wiele razy:
var Layer_1874 = new OpenLayers.Layer.WMS(
'Grundkort',
'/wms10.ashx'
, {
format: 'image/png',
srs: 'EPSG:25832',
layers: 'ballerupkommune_grundkort_bk',
tiled: true,
tilesOrigin: '698804,6173460'
}
, {
displayInLayerSwitcher: true,
isBaseLayer: true,
transitionEffect: 'resize',
displayOutsideMaxExtent: true,
visibility: false
}
);
Czy ktoś ma pomysł?
źródło
Odpowiedzi:
Poniżej znajduje się przykład reguły SLD, która umieszcza etykietę na środku geometrii elementu. Do umieszczenia etykiety użyto funkcji ogc: Function o nazwie „centroid”. Możesz przeczytać więcej o funkcjach SLD w dokumentach GeoServer , a niektóre przykłady podano tutaj .
Również książka kucharska SLD jest świetnym odniesieniem. Jedną z rzeczy, które mogą cię potknąć, jest kolejność tagów w SLD. W przypadku powyższej reguły TextSymbolizer można sprawdzić wymaganą kolejność, przeglądając definicję schematu. Nie martw się, to nie jest zbyt przerażające! Wystarczy wyszukać „textymbolizer” w tym pliku .xsd, a powinieneś łatwo znaleźć znacznik „sekwencji”. Przekonasz się, że odniesienia do elementów są zgodne z kolejnością w moim przykładzie. (Uwaga: nie użyłem atrybutu „wypełnienia” symbolizatora tekstu, moje wypełnienie dotyczy tylko aureoli).
źródło
Obliczanie etykiet z rozdzielczością kolizji (odsuwanie etykiet na bok lub usuwanie etykiet o niższym priorytecie, aby się nie nakładały) wymaga znajomości każdej etykiety, która może kolidować z rysowaną etykietą, każdej etykiety, która może się z nimi kolidować itd. . Ogólnie rzecz biorąc, albo musisz obliczyć wszystkie etykiety na raz, patrząc na każdą cechę, albo podzielić mapę na bloki z etykietami obliczonymi w każdym bloku.
Domyślnie GeoWebCache używa bloku kafelków 4x4 zwanego „metabilnym”. Kiedy poprosisz o kafelek, którego nie ma w pamięci podręcznej, GWC zażąda całego metapliku jako jednego dużego obrazu z zaplecza, a następnie pokroić metaplik na kafelki, które buforuje. Możesz dostosować współczynnik metastabilności podczas konfigurowania warstwy. Większe metatile dają lepiej wyglądające etykiety, ale zwiększają opóźnienie braku pamięci podręcznej. Jeśli nie używasz rozdzielczości kolizji etykiet na zapleczu, możesz ustawić metatiling na 1x1.
Możesz także powiedzieć GWC, aby dodał rynnę wokół metabilizatora, czyli dodatkowej przestrzeni, która zostanie odcięta. Jest to ryzykowne, jeśli masz rozdzielczość kolizji etykiet, ponieważ etykieta może być umieszczona inaczej lub nawet zostać całkowicie usunięta po drugiej stronie metabilizowanej granicy. Jeśli masz etykiety, które są całkowicie ustalone na miejscu i nigdy nie są tłumione, aby uniknąć kolizji, możesz użyć szerokiej rynny, aby umożliwić etykietom przekraczanie granic kafelków. Będzie to miało koszt wydajności, ponieważ GeoServer będzie musiał renderować większy kafelek.
Możesz ustawić metatiling i rynnę na zakładce Warstwa kafelków w konfiguracji warstw, lub domyślną, która będzie używana dla nowych warstw, możesz ustawić na stronie Domyślne buforowanie.
Aby wyłączyć rozwiązywanie konfliktów, możesz użyć
conflictResolution
opcji dostawcy w swoich stylach.źródło