Coğrafi Büyük Veri Saklama ve Webde Gösterimi
Uzun bir süre IOT sektöründe çalışınca tarih ve lokasyon bilgisi içeren büyük veri ile karşılaşmış oldum. 2018 yılı sonunda Postgis ile Türkiye Başarsoft verisi ve Avrupa Osm verisi üzerinden ayda 2 milyar adresleme işlemi yapar duruma gelmiştik eski işyerimde. Tabi bu büyük veriyi anlık işlemek dışında özellikle geriye dönük görsel analizler çok yapmadık.
2016 yılıydı sanırım. Bir seferinde seçilen bir kaç aracın son 1 aylık koordinatları ile ısı haritası oluşturmak gerekti. Bu veriyi bir kargo firması yeni şube açması gereken bölgeler ya da mevcut şubeleri taşıması gerektiği bölgeleri bulmak için kullanacaktı. Isı haritasında yoğun bölgelerde şube olması gerekiyor gibi basit bir mantık vardı. En fazla 1 milyon veriyi görselleştirmiştik. Leaflet üzerinde veriyi json çağırıp heatmap eklentisiyle göstermeye karar kıldık. Bu süreçte sunucu tarafında Mapserver ve Geoserver denedim. Ara yüz tarafında bu işi çözmek daha kolayımıza geldi. Google’ın artık destek vermediği Fusion Tables da denedim. Ama müşteri lokasyonunu başka bir servis sağlayıcı ile paylaşmayı uygun görmedik.
Daha sonraki işimde yani Tübitak’da arayüzde coğrafi büyük veri gösterimi ve veri tabanı tarafında Postgis dışında alternatifleri deneyimleyeceğim bir durum oluştu.
Bir kaç blogda nosql tarafında coğrafi çözümlerin nasıl ele alındığını okuyordum bir süredir. Bir yandan da Uber’in geliştirdği birçok ürünün arasından lokasyon bazlı uygulamaları takip ediyordum. Bunları harmanlayacak bir uygulama olabilir mi diye yola çıkmış olduk bir projede.
Şimdi bu noktada büyük veriyi tanımlamak lazım. Bu konularla uğraşırken herkesin yönelttiği bir soru var, “elindeki veri gerçekten büyük mü?” Veri tabanı çözümleri ile uğraşan herkesten şunu duyarsınız. Her müşteri kendi verisinin büyük olduğunu iddia eder. Kimi için 200 MB veri kimi için terabaytlarca.
Bir verinin büyük olabileceğini tanımlayan 3 özellik tanımlıyorlar. (Örneğin burada; https://www.oracle.com/big-data/what-is-big-data.html). Verinin hacmi, verinin üretiliş hızı, veri detayındaki nitelik. Veri hacmindeki büyüklük bazı kuruluşlar için onlarca terabayt veri bir diğeri için yüzlerce petabayt olabilir. Üretiliş hızı her gün artıyor; sosyal medya verisi, iot mesajları. Yani her yeni kullanıcıyla ve kullanım arttıkça artan ve sürekli akan veriden bahsedebiliriz. Son konu da veri detayı. İlişkisel veri tabanları gibi veritabanı, şema, tablo, kolon gibi tanımlanabilir yapıda olmayan yani hangi yapıda geleceği bilinmeyen ve bir şekilde işlenip kaydedilmesi gereken verilerden ibaret.
Hikaye tarafı yettiyse veri tabanı ve ara yüzde neler bulduk, kullandık bunlardan bahsedeyim.
Postgis ile daha önce çalıştığımız için bildiğimiz veri kaydetmek, indekslemek ve veriye ulaşmak yöntemleri kullandık. Postgis sıkça sorulan soruları araştırarak bulunabilecek işler. İndeksleme, operatörleri kullanmak, st_dwithin, st_intersects, vs kullanmak gibi.
Nosql tarafında elimizde GeoMesa ve GeoWave vardı. Şurada bu araçların mükemmel bir karşılaştırma dokümanı var; https://github.com/azavea/geowave-geomesa-comparative-analysis/blob/master/docs/report.md
GeoMesa’nın dokümantasyon detayı, api anlaşılırlığı ve yeni başlayanlar için öneriliyor olması seçmemize sebep oldu. Tanımında Postgis, Postgresql için ne ise GeoMesa da sık kullanılan nosql veritabanları için odur gibi bir tanım var. Scala’da geliştirilmiş. Milyarlarca coğrafi objeye paralel sorgularla ulaşmayı sağlıyor. GeoTools DataStore kullanarak standart bir şekilde coğrafi objelere erişim sağlıyor. GeoServer kullananlar bilir CQL dili ili sorgulama yapılabiliyor. Ayrıca GeoServer üzerinden de verilere erişim sağlanabiliyor.
Temelde örnekler Accumulo üzerinde. Ama bizim için Cassandra kurulumu ve kod geliştirme daha kolaydı, biz de Cassandra ile devam ettik. Veri konusunda örneklerde Gdelt datası kullanılabiliyor, bu veri ile bolca örnek var.
Foss4g 2019 Bükreş’de çok benzer konuda bir sunum vardı. İzlemenizi öneririm. https://media.ccc.de/v/bucharest-219-a-geo-spatial-big-data-infrastructure-for-asset-management
Sunucu tarafında Postgis ve Geomesa kullandık. Ama elde coğrafi obje varsa illa ki harita üzerinde görselleştirmek gerek. Grid, daire gruplama, nokta gösterimlerinde renklendirme, ısı haritaları, zaman bazlı gösterimler gerekiyor bu durumda.
Uber’in ara yüzde muhteşem çözümleri var. Öncelikle Deck.gl’den bahsedeyim. Webgl destekli büyük veri gösterim aracı olarak geliştirilmiş. Temelde harita örnekleri var. Altlık harita olarak Mapbox kullanıyor. Yakın zamanda nokta bulutu gösterimleri konusunda da çalışmalar yapmışlar. Bu konuda bir diğer yazım; https://medium.com/@ibrahimsaricicek/visualizing-point-cloud-3d-data-on-web-8f9792385e68
Deck.gl bir altlık olarak kullanıp, harita uzmanlarının, veri analistlerinin, şehir plancıların, hatta herhangi bir harita severin kolayca harita analizleri yapabilecekleri json, csv ve geojson gibi sıkça kullanılan dosya formatlarını destekleyen bir çözüm de Kepler.gl. Her ikisi de açık kaynak kodlu. Kepler tüm istediğimiz analizleri karşılıyor bir de ara yüzde anlık milyonlarca veriyi görseleştirmeyi sağlıyor. Hem de ReactJs ile geliştirilmiş. Tabi Keplergl’i kendi verilerimizi analiz etmek için dinamik olarak kendi uygulamamıza entegre ettik. Altta AFAD’dan indirdiğim (~11k) deprem verileri ile analiz örneği.
Arayüzde başka çözümleri de kullandık. Bu konuda çok bilinmese de Çin’den bir çözüm var; AntV. Yalnız harita değil veri görselleştirme konusunda çeşitli grafik çözümler de var. AntV L7 Haritaları da Webgl destekli ve deck ile kepler kadar performanslı çalışıyor. Isı haritası, grid gösterim ibi analiz yöntemleri de çok benzer. Dokümantasyonu ve örnekleri gayet yeterli. Altlık harita olarak Mapbox ve kod içerisinde gördüğüm GaodeMap isimli bir harita kullanıyor. Web sitelerinden birkaç görsel altta.
Altta yine AFAD deprem verisi ile bu kez AntV kullanarak analizler.
Bu noktada harita dışında gösterimlerden de biraz bahsedeyim. Ara yüzde grafik gösterimler için tabi sunucu tarafında büyük veriyi analize uygun ve görselleştirilebilir şekilde temizlemek ve küçültmek gerekiyor. Bundan sonra yoğunlaşacağımız nokta da burası olacak kendi adımıza. Burada ciddi bir istatistik bilgisi gerekiyor tabi. Milyarlarca veriyi 5 sekmeden oluşan bir bar grafikte göstermek için bir efor gerekir. Bu noktayı zaten hallettiğinizi ya da halletiğimizi varsayıyorum.
Javascript,’de veri göreselleştirmede tabi ki ilk akla gelen D3js. D3 veriye dayalı belge işleme için bir JavaScript kütüphanesi. Yalnız grafik gösterim için değil hazır bir çok özelliği sayesinde veri ile oynamayı da olanaklı kılıyor. Ama bir daire grafik çizmek için 50–60 satır kod yazmak gerekiyor.
D3js'e göre çok daha az seçenek sunsa da daha az kod yazarak grafik elde etmek için ChartJs var. Hatta react bir wrapper da var react-chartjs-2. Kendi sitelerinden birkaç grafik örneği aşağıda.
Son bir söz, AntV’nin harita dışındaki görselleri de güçlü gözüküyor demiştim. Özellikle ChartJs yerine AntV G2Plot kullanmayı deneyeceğim ve öneririm.
Eskilerden bir kapanışla bitireyim.