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 ...