Valokuvia hyödynnetään yhä enemmän ja enemmän myös yrityksissä. Otetaan kuvia myyntikohteista, vahingon kohteista, korjauskohteista, työmaiden etenemisestä jne.
Microsoft 365 -ympäristössä valokuvat on luonnollista tallentaa SharePoint dokumenttikirjastoon. Joissain käyttötilanteissa on tarpeen nähdä, missä nämä kirjastossa makaavat valokuvat on tarkalleenottaen otettu.
Lähes kaikki kamerat ja kännykät tallentavat kuvan ottopaikan valokuvan ominaisuuksiin.

Ladattuamme kuvan dokumenttikirjastoon, hakee SharePoint kuvaan tallennettujen koordinaattien perusteella sen karkean ottopaikan ja tallentaa sen Location -kenttään.

Haluaisimme kuitenkin tietää, missä kuva on tarkalleenottaen otettu, mutta kuvan koordinaattitietoihin ei pääse enää käsiksi. Vai pääseekö?
Kuvan EXIF-tietojen hakeminen
Onko mitään mitä ei voi tehdä Power Automatella?
Rakennetaan Flow, joka käynnistyy kun dokumenttikirjastoon ladataan uusi tiedosto.

Flow hakee kaikkien dokumenttikirjaston dokumenttien metatiedot Send an HTTP Request to SharePoint -toiminnolla.

Komento palauttaa laajan JSON-muotoisen vastauksen, joka sisältää dokumenttikirjaston tiedostoista vaikka mitä kiinnostavaa tietoa.

Meitä kiinnostaa kuitenkin MetaInfo ja sen sisältämä lookupValue-kenttä. Sillä sen uumeista löytyy seuraavat.
\"address\":{\"City\":\"Espoo\",\"State\":\"Uusimaa\",\"Country\":\"Finland\",\"EnglishAddress\":\"Druvgränden 2, FI-02710 Espoo, Finland\",\"LocalizedAddress\":null} \"location\":{\"altitude\":35.167692594665176,\"latitude\":60.221705555555559,\"longitude\":24.743752777777779}
Parsitaan nämä kiinnostavat tiedot JSON:ista esiin Parse JSON ja Select -toiminnoilla. Lopuksi poimitaan tulosjoukosta (Filter) meitä kiinnostava osa, eli tiedosto joka juuri lisättiin.

Lopuksi sijaintitiedot tallennetaan kyseisen kuvan metatiedoiksi dokumenttikirjastoon.

Flow on käytännössä kopioitu Brian Edwardsin blogista. Mikäli sen sielunelämä ja toteutuksen yksityiskohdat kiinnostavat, kannattaa lukea Brianin mainio postaus, jossa se käydään tarkemmin läpi.
Lisätään dokumenttikirjastoon vielä Address, Longitude, ja Latitude -kentät. Nyt sijaintikentät täyttyvät oikeilla tiedoilla aina tiedoston lisäämisen jälkeen.

Linkki karttaan
Pelkät koordinaatit eivät ole kovin havainnollisia. Lisätään dokumenttikirjastoon vielä yksi uusi uusi kenttä (MapLink, hyperlinkki) ja tallennetaan Flow’ssa sen arvoksi linkki Google Mapsiin oikeilla parametreilla.

Nyt uudelle riville muodostuu aina linkki Google Maps’iin.

Linkkiä painamalla avautuu näkymä, josta näkee tarkalleen missä kuva on otettu.

Pikkukartta dokumenttikirjaston sarakkeena
Joskus olisi kätevämpää näyttää dokumenttikirjaston jokaisella rivillä pieni karttakuva, josta näkee suoraan missä kuva on otettu.
Tämä onnistuu SharePointin sarakkeiden muotoilulla. Esimerkki tästä löytyy April Dunnamin blogipostauksesta.
Dokumenttikirjastoon voi toki luoda myös kuva-sarakkeen.

Ja tallentaa Flow’lla sen arvoksi kuvan, jonka Googlen API palauttaa.
https://maps.googleapis.com/maps/api/staticmap?center=,[Latitude],[Longitude]&zoom=12&size=400x400&key=[YourAPIKeyHere]
Voit käyttää joko Google Mapsia tai Microsoftin Bingiä. Molempien käyttö edellyttää palvelun API-avaimen hankkimista.
Lopputuloksena jokaisella rivillä näytetään kuvan ottopaikaa kartalla.

Rivit saa muotoiltua korkeammaksi JSON:lla.
Kuvien sijainnin esittäminen Power Appsilla
Edelläkuvatuissa ratkaisuissa nähdään aina yhden valokuvan ottamispaikka. Entä jos haluaisimme nähdä kaikkien valokuvien ottopaikat kartalla samanaikaisesti?
Tällöin kaivamme esille Power Appsin.
Lisätään kuvat sisältävä dokumenttikirjasto (Map) Power Appsin tietolähteeksi ja luodaan galleria, jossa esitetään kyseiset kuvat metatietoineen.

Seuraavaksi lisätään sovellukseen kartta-kontrolli ja asetetaan se hakemaan tietonsa samasta dokumenttikirjastosta (Map).
- Items: Map
- ItemsLabel: Map.Name
- ItemsLongitude: Map.Longitude
- ItemsLatitude: Map.Latitude

Nyt dokumenttikirjaston kuvat näkyvät omina pisteinään kartalla.
Tehdään vielä muutama viilaus.
Asetetaan galleria esittämään kartalta valitut kuvat. Mikäli kartalta ei ole valittu yhtään kuvaa, näytetään kaikki.
(Gallery) Items: If(IsBlank(Map1.Selected), Map, Filter(Map, Map1.Selected.Name = Name))

Tehdään sama myös toisinpäin. Mikäli galleriasta valitaan kuva, näytetään kartalla vain se.
Tallennetaan galleriasta valittu kuva muuttujaan.
OnSelect : Select(Parent); UpdateContext({varShowOnMap: ThisItem})

Ja hyödynnetään tätä tietoa kartalla.
(Map) items: If(IsBlank(varShowOnMap),Map, varShowOnMap)
Lisätään lopuksi painike, jolla galleriavalinnan voi poistaa.

Kelpaa!
Kuvien sijainnin esittäminen Power BI:llä
Samaan lopputulokseen päästään myös Power BI:n avulla.
Luodaan raportti, jonka ainoana tietolähteenä on SharePointin dokumenttikirjasto, jonne kuvat on tallennettu.
Hieman hämäävästi valitsemme tietolähdetyyppiksi SharePoint Online List, emme SharePoint folder.

Siivotaan turhat sarakkeet pois ja luodaan uusi joka sisältää kuvan osoitteen.

Siivottu tietolähteemme näyttää tältä.

Lopuksi lisäämme raportille
- taulukon jossa näytetään kuva ja sen nimi
- kartan, jossa esitetään kuvien ottopaikat

Raportti toimii käytännössä samalla tavalla kuin toteuttamamme Power Apps.
Yhteenveto
Mikä tämän tarinan opetus lopulta oli?
Useimpiin ongelmiin voidaan tarjota ratkaisu hyvin kevyesti. Kuten jutun alussa. Näytimme vain dokumenttikirjastossa kuvien koordinaatit. Pienellä lisävaivalla saimme luotua kirjastoon linkin, josta käyttäjä näkee yksittäisen kuvan ottopaikan kartalla.
Voimme tarjota ongelmaan aina myös hienompia ja monipuolisempia ratkaisuja. Kuten sen, että kaikki kuvat esitetään yhdessä karttanäkymässä ja käyttäjä voi valita joko
- kuvatiedoston joka näytetään kartalla tai
- pisteen kartalta, jolloin hän näkee mikä kuva on kyseessä
Tällöinkin meillä on tarjolla useita erilaisia toteutustapoja. Tällä kertaa käytiin läpi Power Apps ja Power BI. Samaan lopputulokseen oltaisiin päästy myös SharePoint-listan päälle tehtävällä SPFx-kontrollilla.
Mikä näistä sitten on oikea ratkaisu? Se riippuu täysin tilanteesta.
- Ketkä ratkaisua käyttävät?
- Mitä työkaluja he käyttävät jo nyt kyseisessä konteksissa?
- Mitä lisenssejä on käytössä?
- Halutaanko välttää räätälikoodia?
- jne jne