Viac

Vektorové vykresľovanie otvorených vrstiev


Práve som pridal na mapu niekoľko ďalších vektorových vrstiev podporovaných systémom WFS a výkon klesol. Pri ladení som si všimol, že openlayery pri vykresľovaní zohľadňujú všetky funkcie vo viditeľných vrstvách.

Ak ich priblížim správne, existuje iba niekoľko funkcií z niekoľkých vrstiev a potom povedzme posuňte mapu o malé množstvo. Očakával by som, že openlayery použijú priestorový index na identifikáciu funkcií, ktoré je potrebné vykresliť, a iba ich vykreslenie.

Vidím však, že moje štýly založené na kontexte sú požiadané o informácie o symbolizéri pre každú funkciu v každej vrstve. Napr. moja externá grafická funkcia je označovaná za funkcie, ktoré sú na druhom konci krajiny!

externalGraphic: function (f) {return map.zoom 

Pri oddialení nie sú moje vrstvy viditeľné, ale pri priblížení sa zrazu zvažuje 1 000 s funkcie. Existuje spôsob, ako prinútiť openlayery použiť pri vykresľovaní nejaký filter? Uvažoval som o pridaní obslužných rutín udalostí priblíženia/posunutia mapy na mapovanie funkcií vo vrstvách a mimo nich pomocou priestorového filtra, ale som si celkom istý, že by som to nemal robiť.

Neverím, že problém je v skutočnosti, že moje údaje pôvodne pochádzajú zo zdroja WFS. Moja aplikácia tiež beží offline, údaje sú po načítaní uložené lokálne a načítanie a zdroje potrebné na ich uchovanie v pamäti sú v poriadku.

Musí existovať spôsob, ako dosiahnuť, aby OL aplikovalo určitú inteligenciu pri vykresľovaní vektorových funkcií pri priblížení, nemalo by to ani zvažovať vykresľovacie funkcie, ktoré sú stovky míľ vzdialené od aktuálnych hraníc, pretože to spúšťa získavanie obrázkov buď z lokálneho súborový systém alebo server, keď sa úroveň priblíženia prepne zo všeobecnej ikony na podrobnejší obrázok konkrétneho zariadenia.

Celkovo mám asi 5 000 funkcií, to by mala byť triviálna čiastka. Tento problém som vyriešil tak, že som spracovával udalosti presunu/priblíženia a mapoval svoje funkcie do a von z vrstiev pomocou stromu quad z knižnice na mieru, ktorú som napísal pred rokmi a od ktorej sa chcem vzdialiť. Toto je škaredý hack, ktorému sa mi nechce veriť, že neexistuje elegantnejší spôsob riešenia. Očakával by som, že k mape poskytnem svoje vektory a nechám ich spravovať.


Pôvodne by som sa pozrel na optimalizáciu vrstvy na úrovni servera. Tu je niekoľko možností, ktoré je potrebné zvážiť (ak vaše údaje pochádzajú z tabuľky GeoServer/PostGIS):

  • Pomocou možnosti „Limit funkcií na vyžiadanie“ (na webe GeoServer) obmedzte počet funkcií, ktoré sa budú čerpať
  • Definujte priestorový index v tabuľke (tabuľka PostGIS)

WFS nie je tak vhodný na vizualizáciu za letu-nezvláda mierku/priblíženie. Aby sa zlepšil výkon vektorového zobrazovania na strane klienta, malo by byť zaistené, aby (1) boli načítané a vykreslené iba funkcie v zobrazení a (2) zobrazené funkcie boli správne zjednodušené a agregované podľa každej úrovne priblíženia.

Ak chcete vyriešiť 1, priestorové indexovanie je riešením. Pre vrstvy veľkých a zložitých predmetov, vektorové obklady je vhodnejšou možnosťou.

Na vyriešenie problému 2 by mal byť dátový formát tenký, aby sa zaistil rýchly čas prenosu cez web a tiež rýchla analýza zo strany klienta (uprednostnite napr. GeoJSON nad hrozným GML). Okrem toho by ste mali použiť generalizačné techniky na strane servera na zjednodušenie/agregáciu údajov pre každú vrstvu priblíženia. Prenos a vykresľovanie zjednodušených geometrií je skutočne rýchlejšie.


Ak odkazujete na súbor, bez ohľadu na to, ako je indexovaný alebo v akom formáte je, bude sa stále sťahovať a obsahovať funkcie, ktoré sa nenachádzajú vo vašom zobrazení. V tomto prípade je potrebné použiť softvér mapového servera. Server s dlaždicami bol navrhnutý vyššie, ale server s dlaždicami sa zvyčajne nachádza medzi mapovým serverom a používateľom. Skúste implementovať niečo ako mapserver, mapnik alebo geoserver. Vlákno SO, ktoré o nich hovorí: Mapnik, Mapserver alebo Geoserver

Ako funguje takýto systém:

1-z vášho klientskeho rozhrania, bezproblémový v prehrávači, sa na server odošle požiadavka na vrstvu s príslušnými geopriestorovými hranicami.

2-Serverový softvér interpretuje požiadavku a uchopí príslušný súbor alebo sa pýta na príslušnú databázovú tabuľku, aby zhromaždil údaje, ktoré „zodpovedajú“ vášmu aktuálnemu zobrazovaciemu portu.

3-mapový server zaistí správny formát (png, kml atď.) A streamuje ho do prehliadača

4-o vykreslenie sa postará vaša funkcia prehrávania openlayers. Samozrejme, budete musieť trochu kódovať, aby ste sa uistili, že váš štýl atď.

Vidíte teda, že sa dopytujú iba požadované údaje a presúvajú sa cez vaše webové pripojenie ... žiadne funkcie, žiadne údaje! Aj keď máte dotaz, ktorý v podstate vyberá všetko, môžete výstup nakonfigurovať tak, aby mal informovanosť o úrovni priblíženia, takže napríklad priblíženie na úrovni krajiny by neposkytovalo údaje z vedľajšej ulice.

Ak máte problémy s mapou/údajmi a vytvárate webové stránky, naučiť sa používať server na mapovanie na strane servera stojí za to. Nebolo to tak dávno, keď sme museli vytvoriť vlastné mapovacie programy ..., ktoré z webového GIS v podstate urobili doménu programátorov, nie mapovanie ľudí. Skutočnosť, že v dnešnej dobe existujú robustné, bezplatné a na funkcie bohaté programy, ktoré to robia za nás, je neuveriteľná!


Chcel by som to pridať ako komentár, ale keďže nemám povesť, povedal som si, že by som to uviedol ako odpoveď. Verím, že v OpenLayers 3 sa používa zjednodušenie aj nejaká forma priestorového indexovania na zlepšenie výkonu vektorov. Možno stojí za to to vyskúšať, ak v súčasnosti používate OL2. Zdroj http://www.slideshare.net/mobile/camptocamp/open-layers3


Pozri si video: Matematika.. Skalárny Súčin Vektorov A Jeho Využitie (Septembra 2021).