Blogeinträge zum Thema: Google

Alles rund um das ausgewählte Thema ... Zeige max. 5 Stories pro Seite von 2

Erstellen von Kartendaten mit Lokations-Informationen

Google, Here, Domino, Maps

Bevor man Karten erstellt, braucht man noch Daten der Lokation (also fuer welche Gegend man die Karte erstellen will und was man ggf. einzeichnen moechte). Hier ergibt sich bei meinen Bildern ein erstes Problem, ich habe fuer die Kamera das GPS deaktiviert, somit sind in den Bilddaten keine Infos diesbezueglich hinterlegt.

Also musste ich erst einmal die Lokation zu den Bildern ermitteln (zumindest von denen, wo ich mich noch erinnere wo das war). Hierzu verwende ich die Google „Place“ Suche. Hierzu uebergebe ich der Suche die nachfolgenden Daten und schaue was Google darueber findet (via REST-API).

Die Trefferquote ist hierbei bei mir bei ueber 90%. Ich bewege mich wohl auf ausgetretenen Pfaden (Ausnahme bilden hier ein paar Lokationen im Kosovo).

Die Google Places API gibt aber nicht viel her, deshalb ist bei der Abfrage eigentlich nur die eindeutige ID interessant und ggf. die Adresse (wenn mehrere Treffer zurueckkommen, weil es mehrere Treffer gibt, dann mache ich eine Selektion ueber die Adresse).

Ach ja, das ganze benoetigt noch einen Account in der Google-Cloud (haate ich ja schon bzgl. Google-Vision erklaert).

Wie man hier schon sehen kann, gibt es noch einen zweiten Key fuer die Karten (hierzu spaeter mehr). Zuerst erweitern wir einmal die Informationen der Places-API. Hierzu gibt es noch eine Detailsabfrage, welche die eindeutige Google-ID benoetigt.

Hierueber bekommen ich dann die detailierten informationen (Oeffungungszeiten, Telefon, Lat, Lng, Website ...). Der Script-Agent schreibt diese Information in das Image-Dokument.

Danach versuche ich die Daten noch ueber Here zu verifizieren. Hier findet nicht ganz so viele Lokationen wie Google, aber ich verwende deren Karten lieber (mehr Moegglichkeiten zur Konfiguration und guenstiger, wobei ich bei beiden nicht an die Begrenzung komme). Fuer Here wird auch ein Account benoetigt und man kann sich entsprechendt eine API key damit erstellen.

Mit den nun vorhanden Informationen kann ich zur jeweiligen Lokation eine Karte erstellen. Wenn Here die Lokation kennt, dann hiermit, sonst mit der Googlemaps API.

Die Grafik kann mit der API URL heruntergeladen werden und an das entsprechende Lokations-Dokument angehaengt werden. Hierzu verwende eine einfache JavaLib.

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;

public class GetImageFromUrl {

    public static boolean getImageFromUrl(String imageUrl, String filePath) {
        try {
            URL url = new URL(imageUrl);
            InputStream is = url.openStream();
            OutputStream os = new FileOutputStream(filePath);
            byte[] b = new byte[2048];
            int length;
            while ((length = is.read(b)) != -1) {
                os.write(b, 0, length);
            }
            is.close();
            os.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

Welche dann ueber Ls2J in meiner LotusScript-Aktion aufgerufen werden kann.

Dim jSession As New JavaSession
	Dim jClass As JavaClass
	
	Set jClass = jSession.GetClass( "GetImageFromUrl" )     
	
	Set doc = dc.GetFirstDocument
	
	Do While Not doc Is Nothing
		fName = "c:\temp\" & doc.GetItemValue("unique")(0) & ".png"
		lat = Replace(Cstr(doc.GetItemValue("gsp_lat")(0)), ",", ".")
		lng = Replace(Cstr(doc.GetItemValue("gsp_lng")(0)), ",", ".")
		mapURL = "https://image.maps.ls.hereapi.com/mia/1.6/mapview?apiKey={key}" & lat & "," & lng & "&z=16&w=640&h=480&t=3&f=4&i=1&pip=-4"
		
		If jClass.getImageFromUrl(mapURL, fName) Then			
			Set rtitem = New NotesRichTextItem( doc, "mapHere" )
			Set object = rtitem.EmbedObject( EMBED_ATTACHMENT, "", fName)
			
			Call doc.Save(True, False, True)
			
			Kill fName
		End If
		
		Set doc = dc.GetNextDocument( doc )
	Loop

Wenn ich nun eine Lokation erstellt habe, dann kann ich diese auch anderen Bildern zuweisen.

Auf meiner Seite werden bei den Bildern, wo mir die Lokation eingefallen ist, entsprechend der Name angezeigt.

Und wenn man die Lokation anklickt, dann wird entsprechend die Karte angezeigt mit den entsprechenden Detailinformation (soweit bekannt).

Fuer die Maps von den Lokationen verwende ich als format PNG, bei den Laender- und Stadt-Karten SVG, da diese besser skalieren auf dem mobiles. So kommen also die erweiterten Information auf diese Seite, keine Hexerei ...

Google Cloud Vision API kurzer test.

Google, Cloud, Vision

Wie versprochen, hier nun ein kurzer Test der Google Cloud Vision API. Im Vergleich zu der Azure Vision API (und wem faellt auf das diese auch noch gleich heissen).

Als erstes erstelle ich also eine Cloud-Vision API (btw, ich ahbe hierzu einen Test-Account bei Google Cloud angelegt, welcher ein 300$ Guthaben hat. Also genug Startkapital zum testen).

Nachdem der Service angelegt ist, muss der Zugriff konfiguriert werden. Wie auch bei Azure, werde ich den Zugriff nur ueber einen API-Key testen (das ist wesentlich einfacher als der Token-Dance).

Ein solcher key ist nicht nur auf ein Service beschraenkt (hier allerdings nur auf Vision, daher das gruene Check-Mark).

Auch Google Cloud bietet fuer seine APIs einen API-Explorer an, mit welchem sich das ganze direkt im Browser testen laesst.

Was bei Google Vision schon einmal anders ist, es wird nicht nur das eigentlich target als JSON uebergeben, sondern auch alle Parameter (ausser der API-Key). Das hat den Vorteil, das man auch das Image selbst base64 encoded mit uebergeben kann. In meinem Fall uebergebe ich das Image aber als einen Link auf einen Blob in der Google Cloud.

Das ganze habe ich auch der besseren uebersicht wegen (und des besseren Testmoeglichkeiten) auch in Postman umgesetzt.

Das Ergebnis kommt wie in Azure auch als JSON zurueck.

{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/03qtwd",
          "description": "Crowd",
          "score": 0.946631,
          "topicality": 0.946631
        },
        {
          "mid": "/m/081pkj",
          "description": "Event",
          "score": 0.8454896,
          "topicality": 0.8454896
        },
        {
          "mid": "/m/01d74z",
          "description": "Night",
          "score": 0.6663509,
          "topicality": 0.6663509
        },
        {
          "mid": "/m/01n32",
          "description": "City",
          "score": 0.64202905,
          "topicality": 0.64202905
        },
        {
          "mid": "/m/0cp_p",
          "description": "Taste",
          "score": 0.5708056,
          "topicality": 0.5708056
        },
        {
          "mid": "/m/07bxq",
          "description": "Tourism",
          "score": 0.56889546,
          "topicality": 0.56889546
        },
        {
          "mid": "/m/0cgh4",
          "description": "Building",
          "score": 0.53372097,
          "topicality": 0.53372097
        },
        {
          "mid": "/m/0c1vxg",
          "description": "Mixed-use",
          "score": 0.50829864,
          "topicality": 0.50829864
        }
      ]
    }
  ]
}

Und hier nochmal das Bild, welches (wie auch in Azure) analysiert wurde.

Mit Google Vision habe ich einmal alle meine Bilder auf dem iPhone analysiert (einen link zu der Seite findet Ihr rechts Gradzombossa). Ich habe auch die anderen Optionen probiert, wie Adult oder Locations. Hierzu in einem spaeterem Post mehr.