OpenLayers 3’te WMS Katmanlarının Hızlandırılması

Web uygulamalarında birden fazla WMS katmanı ile çalışırken performans düşüklüğü yaşamanız olasıdır. Bunun sebebi katmanlara ait verilerin anlık olarak veritabanından çekilmesi ardından render edilmesi ve bunu her tile için yapılması üstüne bunların istemci tarafında sıralı olarak gösterilmeye çalışılmasıdır. Bunun önüne geçmek için katmanın cache lenmesi (GeoWebCache) bir seçenek olarak karşımıza çıkabilir. Böylece veri önceden çekilmiş, render edilmiş sadece istemci tarafında gösterilmesi kalmıştır. Fakat bu durumda canlı veri ile çalışma imkanınız ortadan kalkar. Eğer canlı veri ile çalışmanız zorunlu ise WMS kullanmalı dolayısıyla istemci tarafından optimizasyona gitmeniz gerekir. Bu yazımda OpenLayers 3 ‘te GeoServer’dan gelen birden fazla WMS katmanını nasıl daha performanslı olarak kullanabileceğinden bahsedeceğim.

Katman Tanımlama

OpenLayer 3 ‘te WMS katmanlarını tek tile (single tile) veya çoklu tile (tiled) olmak üzere iki şekilde tanımlamanız mümkündür. Tek tile olarak tanımlanması halinde ekranını kaplayan alandaki tüm veri çekilmesi beklenir ardından render işlemi yapılır ve istemci tarafına gönderilir. Çoklu tile ise ekranı küçük parçalara (tile) bölerek bunlara ait veriler ayrı ayrı işlenir ve istemciye gönderir. Dolayısıyla tek tile’da kullanıcının bekleme süresi uzarken ve kullanıcı haritanın donduğunu düşünür. Fakat çoklu tile’da harita parça parça daha hızlı yüklenir. Ayrıca kullanıcı bazı tile ların yüklendiğini gördükçe web uygulamasının çalıştığını anladığından olumlu bir etki meydana gelir. Aşağıda OpenLayers 3 ‘te bir wms katmanının hem tek tile hem de çoklu tile şeklinde nasıl tanımlanacağı gösterilmiştir.

Tekli tanımlama da her WMS katmanı ayrı bir ol.layer.Image nesnesi olarak tanımlanır

var K1 = [
new ol.layer.Image({source: new ol.source.ImageWMS({url: url, params: {'LAYERS': 'WS:M_MAHALLE', 'format': 'image/png', TRANSPARENT: true, 'tiled': false, serverType: 'geoserver'}})}),
new ol.layer.Image({source: new ol.source.ImageWMS({url: url, params: {'LAYERS': 'WS:M_ADA', 'format': 'image/png', TRANSPARENT: true, 'tiled': false, serverType: 'geoserver'}})})
];

 

Çoklu tanımlamada ise bir ol.layer.Image nesnesine birden fazla WMS katmanı tanımlanır:
var K8 = [
new ol.layer.Tile({source: new ol.source.TileWMS({url: url, params: {'LAYERS': 'WS:M_MAHALLE,WS:M_ADA', 'format': 'image/png', TRANSPARENT: true, 'tiled': false, serverType: 'geoserver'}})})
];

 

Birden Fazla Katman Tanımının Teke İndirilmesi

Sunucuda render edilen harita verisi (tile’lar) istemciye gönderilir. OpenLayers 3 gelen bu veriyi sizin katman sıralamanıza göre üst üste birleştirirerek haritayı oluşturur. Aslından burada da yine bir render işlemi gerçekleşmektedir. Katman sayınız ne kadar çok ise bu işlem o kadar kaynak harcar. Haritayı her sürüklemenizde render işlemi tekrarlanır. Bunun önüne geçmek için katmanlarınızı GeoServer ‘dan uygun sıraya göre render edilmiş olarak almanız mümkündür. Böylece daha GeoServer’dan hazır render edilmiş haritaya ait tile’ları OpenLayers 3 ‘te birleştirmenize gerek kalmaz.Ayrıca tile sayısı azaltıldığı için sunucuya yapılan istek saysı da azalcaktır. Bu teknik ile iki açıdan kazançlı çıkarsınız: 1- istemcide render işlemi asgariye indirilir, 2- ağ trafiği azaltılır.

GeoServer ‘da tile’lar birleştirilirken oluşan görüntüde gereksiz bazı bilgiler (transparan pikseller vs.) ortadan kalkacağı için boyut açısından da oldukça avantaj sağlanır.

Katmanlarınızı web uygulamanız üzerinden açma kapama kontrollerini yapmak istiyorsanız bunu OpenLayers 3 katmanınızın WMS parametrelerine müdahale yaparak gerçekleştirmeniz mümkün.

Ayrıca GeoServer üzerinden Layer Group olarak adlandırılan birden fazla katmanın birleşiminden oluşan katman topluğunu kullanarak hepsini bir araya getirebilirsiniz. Fakat bu durumda katmanlarınız toplu olarak açılıp kapanacaktır yani belirlediğiniz katmana müdahale şansınız ortadan kalkar.

Format

Aslında bu kısım daha çok sunucu ile alakalı olmasına rağmen OpenLayers uygulamamızı etkilemesinden dolayı bahsetme gereği duydum. WMS katmanlarınız için seçeceğiniz format performans açısından önem taşımaktadır. GeoServer ‘ın WMS servisinde kullandıığı formatlara şu adresten erişebilirsiniz(http://docs.geoserver.org/stable/en/user/services/wms/outputformats.html).

PNG formatı kalite açısından oldukça iyi olmasına rağmen boyut açısından büyüktür. Büyük veri daha fazla yüklenme süresine sebep olabilir.

JPEG formatı kalite açısından PNG kadar iyi olmasada boyut olarak çok tutumlu sayılır. Kötü yanı ise saydamlık özelliğine sahip değildir. Dolayısıyla birden fazla katman ile çalışmak pek mümkün değildir. Ancak altlık olarak kullanılacak katmanlarda rahatlıkla tercih edilebilir.

GIF ‘de JPEG gibi özelliklere sahip olup PNG formatından daha küçük boyutta görüntüler oluşturur.

PNG8 formatı bence en ideal olanıdır. Hem boyutu PNG ‘ye göre küçük hemde saydamlık özelliğine sahiptir. Ayrıca kalite açısından PNG ‘den farkını anlamak pek kolay değildir. Fakat yüklenmes süresi PNG ‘ye oranla biraz daha fazla olabilmektedir.

Aşağıda çeşitli katman tanımlamalarının performans grafikleri verilmiştir. Ayrıca bu testlere ait kaynak kodu GitHub repomda bulabilirsiniz

Sonuç

Yukarıdaki işlemleri gerçekleştirmeniz halinde haritanız tile ‘lara bölünmüş olarak asenkron biçimde daha hızlı yüklenecektir. Böylece kullanıcıyı haritanın donduğu veya yavaş çalıştığı düşüncesinden uzak tutacaksınız. Çoklu katman özelliği ile katmanlarınız sunucu üzerinde birleştirilecektir. Böylece istemci üzerinden fazladan render işlemine gerek kalmaz. Tüm katmanlar sadece tek bir katman haline gelir. Bu sadeyede daha az veri ile de çalışmış olursunuz. Son olarak PNG8 formatı ile hem oldukça kaliteli hemde boyut açısından oldukça küçük tile ‘lar üreterek ağ trafiğini azaltmış olacaksınız. Tüm bu iyileştirmeler neticesinde OpenLayers 3 tabanlı uygulamanızda gözle görülür bir hız artışı olacağını tahmin ediyorum. Fakat şunu belirtmeliyim ki hangi tekniği uygulayacağınızı belirleyen pek çok faktör mevcuttur. Örneğin katman sayısı, katmanın altlık olup olmayacağı, web uygulamasının mobilde mi yoksa normal tarayıcıda mı çalışacağı gibi unsurlar katmanlarınızın tanımlama şeklinde önem taşır.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s