ArcGIS Maps SDK for JavaScript ile Web Uygulamaları – 10 OpenWeather ile Hava Durumunun Sahneye Yansıtılması

Bu blog yazısında; ArcGIS Maps SDK for JavaScript yeteneklerinden Weather Widget kullanarak sahne üzerinde tıklanan noktanın hava durumu bilgisini, OpenWeather ile alıp sahneye yansıtmayı ele alacağız.

Başlamadan önce sahip olunması gerekenler;

  • OpenWeather hesabı ve hesaba bağlı bir API key
  • ArcGIS üzerinden yayınlanmış bir 3D Web Scene

Adımlar

1 – Geliştirme ortamı için aşağıdaki şablon kodu kullanarak bir .html dosyası oluşturun

<html lang="tr">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
        <title>ArcGIS Maps SDK for JavaScript</title>
        <link rel="stylesheet" href="https://js.arcgis.com/4.27/esri/themes/light/main.css" />
        <script src="https://js.arcgis.com/4.27/"></script>
        <style>
            html,
            body,
            #viewDiv {
                padding: 0;
                margin: 0;
                height: 100%;
                width: 100%;
            }
        </style>
    </head>
    <script>
            require([
                "esri/views/SceneView",
                "esri/WebScene",
                "esri/widgets/Search"
            ], (SceneView,WebScene,Search) => {
                let apiKey      = // OpenWeatherdan aldığımız API Key
                let webSceneID  = // Portal Üzerindeki SceneID

                const scene = new WebScene({
                    portalItem: {
                        id: webSceneID
                    }
                });

                const view = new SceneView({
                    map: scene,
                    container: "viewDiv"
                });

                const searchWidget = new Search({ // Search Widget tanımlıyoruz
                    view: view
                });

                view.ui.add([searchWidget],'top-right') // Search Widgetı Harita Görünümümüze Ekliyoruz

            });
    </script>
    <body>
        <div id="viewDiv" class="esri-widget"></div>
    </body>
</html>

Kod içerisinde bulunan webSceneID tanımlamasını portal üzerinden aldığınız bir Web Sahne ID’si ile doldurun. Web sahnesi ya da diğer ArcGIS içeriklerinin ID’lerine ArcGIS Portal üzerinden detay sayfasına gittiğinizde ekranın sağ tarafından erişebilirsiniz.

apiKey parametresini ise OpenWeather üzerinden aldığınız API Key ile doldurun. OpenWeather üzerinden nasıl API Key alacağınızı öğrenmek için tıklayın

2- Uygulamamıza Axios kütüphanesini dahil ederek OpenWeather servislerine yapacağımız isteklerin altyapısını oluşturalım. Aşağıdaki kod bloğunu <head> etiketinin üst taraflarına ekleyelim. HTML sayfamızın başlığını belirleyen <title> etiketinin alt satırına ekleyebilirsiniz.

 <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

3- Uygulamamızın temel konsepti sahne üzerinde tıklanan noktanın hava durumunu yansıtmak olduğu için, öncelikle sahnenin oluşup oluşmadığını kontrol etmeliyiz. Bunun için aşağıdaki kodu ekleyelim. Bu kod ile View dediğimiz harita görüntüsü oluşmadan önce kodlarımızın çalışmasını ve oluşabilecek bir hatayı engellemiş oluruz.

Kodu view tanımlamasından sonraki satırlara ekleyelim

Diğer adımlarda paylaşılan kodlar burada yorum satırı ile belirtilen yere eklenerek devam edilmelidir.

  view.when(()=>{
     // Kodlarımız buraya yazılmalıdır.
 })

4- Sahne üzerindeki harita tıklamalarını kontrol etmek için bir haritamızın View nesnesine yeni bir listener ekliyoruz. Aşağıdaki kod haritada her tıklamadan sonra çalışarak tıklanan konum bilgisini getWeather adında tanımladığımız bir fonksiyona yönlendirecektir. View nesnesinin alabileceği diğer listener türleri için tıklayınız.

  view.on("click", (e) => {
     let lat = e.mapPoint.latitude
     let lon = e.mapPoint.longitude
     getWeather(lat,lon)
 })

5 – getWeather adında bir fonksiyon oluşturalım. Bu fonksiyon sahne tıklamalarından gelen enlem ve boylam bilgilerini OpenWeather servisine göndererek hava durumunu sorgulayacak ve gelen bilginin sahnemizde görünür olmasını sağlayacaktır.

const getWeather = async (lat,lon) => {
    await axios.get(`
        https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&exclude=daily&appid=${apiKey}
    `)
    .then(response => {
        let data    = response.data
        let weather = data.weather[0].main
        switch (weather) { 
            case 'Rain':
            view.environment.weather = {
                type: "rainy", // Hava durumunun tipi                                    
                cloudCover:data.clouds.all/100, // Bulutluluk oranı
                precipitation:0.6    // Yağış yoğunluğu
            }    
                break;
            case 'Snow':
            view.environment.weather = {
                type: "snowy",                                    
                cloudCover:data.clouds.all/100,
                precipitation:0.6
            }
                break;
            case 'Clouds':
            view.environment.weather = {
                type: "cloudy",                                    
                cloudCover:data.clouds.all/100
            }
                break;
            default:
                break;
        }
    })
    .catch(err =>{
        console.error(err)
    })
}

Gelen hava durumu tipini kontrol edip, Weather Widget bilgisini güncelliyoruz. Servisten gelebilecek hava durumu tiplerini buradan öğrenip fonksiyonu geliştirebilirsiniz.

Tüm aşamalardan sonra kod aşağıdaki gibi gözükmelidir.


 <html lang="tr">
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="initial-scale=1,maximum-scale=1,user-scalable=no"
    />
    <title>ArcGIS Maps SDK for JavaScript</title>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <link
      rel="stylesheet"
      href="https://js.arcgis.com/4.27/esri/themes/light/main.css"
    />
    <script src="https://js.arcgis.com/4.27/"></script>

    <style>
      html,
      body,
      #viewDiv {
        padding: 0;
        margin: 0;
        height: 100%;
        width: 100%;
      }
    </style>
  </head>
  <script>
    require(["esri/views/SceneView", "esri/WebScene","esri/widgets/Search"], (
      SceneView,
      WebScene,
      Search
    ) => {
      let apiKey     = // OpenWeatherdan aldığımız API Key
      let webSceneID = // Portal Üzerindeki SceneID

      const scene = new WebScene({
        portalItem: {
          id: webSceneID,
        },
      });

      const view = new SceneView({
        map: scene,
        container: "viewDiv",
      });

      const searchWidget = new Search({ // Search Widget tanımlıyoruz
        view: view,
      });

        view.ui.add([searchWidget], "top-right"); // Search Widgetı Harita Görünümümüze Ekliyoruz

      view.when(() => {
        view.on("click", (e) => {
          let lat = e.mapPoint.latitude;
          let lon = e.mapPoint.longitude;
          getWeather(lat, lon);
        });

        const getWeather = async (lat, lon) => {
          await axios
            .get(`
              https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&exclude=daily&appid=${apiKey}
             `)
            .then((response) => {
              let data = response.data;
              let weather = data.weather[0].main;
              switch (weather) {
                case "Rain":
                  view.environment.weather = {
                    type: "rainy",                     // Hava durumunun tipi
                    cloudCover: data.clouds.all / 100, // Bulutluluk oranı
                    precipitation: 0.6,                // Yağış yoğunluğu
                  };
                  break;
                case "Snow":
                  view.environment.weather = {
                    type: "snowy",
                    cloudCover: data.clouds.all / 100,
                    precipitation: 0.6,
                  };
                  break;
                case "Clouds":
                  view.environment.weather = {
                    type: "cloudy",
                    cloudCover: data.clouds.all / 100,
                  };
                  break;
                default:
                  break;
              }
            })
            .catch((err) => {
              console.error(err);
            });
        };

      });

    });
  </script>
  <body>
    <div id="viewDiv" class="esri-widget"></div>
  </body>

 </html>

Aşağıda bulunan örnekte uygulamanın genel çalışma şekli gösterilmiştir. Anlık hava durumları birbirinden farklı 3 şehir seçilmiştir. Bulutlu hava gösterimi için Ankara, örneğin hazırlandığı tarihte yağmur yağdığı için Waterford ve kar yağışını gösterebilmek için Alaska’nın bir bölümüne gidilmiş ve hava durumları Web Sahnesi üzerinde gösterilmiştir.

İleri düzey ArcGIS Developer eğitimleri, atölye çalışmaları ve yol gösterme hizmetleri için Esri Türkiye Profesyonel Hizmetler birimi ile irtibata geçiniz.

Esri Türkiye 2023

Önceki Yazı
ArcGIS Pro’da Analizler – Vejetasyon Çalışması
Yazıyı görüntüle
Sonraki Yazı
ArcGIS Drone2Map 2023.2 Yenilikleri! 
Yazıyı görüntüle