Sitzungsnavigation: keine Veranstaltung ausgewählt. (Veranstaltung wählen.)

Google Maps, KML, XQuery, BaseX, Georeferenzierung (ITG/slu)




0.1. Georeferenzierung mit Google Maps und Überführung in relationales Datenformat für Import in MySQL-Datenbank

0.1.1. 1. Karte in Google Maps erstellen:

Erforderlich ist ein Google-Account. Der Aufruf erfolgt über https://www.google.com/maps/d/?hl=de&authuser=0&action=open.

0.1.1.1. Schritt 1: Angabe eines Kartentitels, eines Kommentars zur Karte als ganzer, Setzen von Markierungen (Punkte, Linien oder Polygone):

N:SharesWebDHLehrehtml/wp content/uploads/2015/06/1435238132 GoogleMaps step1

N:SharesWebDHLehrehtml/wp content/uploads/2015/06/1435238132 GoogleMaps step1

0.1.1.2. Schritt 2: Bezeichnung einer gesetzten Markierung und Beigabe eines Kommentars in strukturierter Form

N:SharesWebDHLehrehtml/wp content/uploads/2015/06/1435238129 GoogleMaps step2

N:SharesWebDHLehrehtml/wp content/uploads/2015/06/1435238129 GoogleMaps step2

0.1.1.3. Schritt 3: Export der Googlekarte in eine KML-Datei

N:SharesWebDHLehrehtml/wp content/uploads/2015/06/1435238127 GoogleMaps step3

N:SharesWebDHLehrehtml/wp content/uploads/2015/06/1435238127 GoogleMaps step3

Struktur der exportierten KML-Datei:

N:SharesWebDHLehrehtml/wp content/uploads/2015/06/1435238124 GoogleMaps step4

N:SharesWebDHLehrehtml/wp content/uploads/2015/06/1435238124 GoogleMaps step4

0.1.2. 2. Umwandlung der KML-Datei in CSV-Datei mittels XQuery durch Ausführung des XQuery-Codes mit Programm XQuery.exe (download) und Import in die Datenbank VA_xxx

ACHTUNG: Die Tags "<kml xmlns='http://www.opengis.net/kml/2.2'>" und "</kml>" müssen in der KML-Datei gelöscht werden! Die Umwandlung mit XQuery.exe funktioniert sonst nicht. Die vollständige Prozedur ist in einem sog. Shell-Skript (\\allshares\...\VerbaAlpina\import_mapdata\bin\import_maps.sh) zusammengefasst und dadurch weitgehend automatisiert. Code der Datei kml2csv.xql (XQuery-Code):

declare function local:reduceDim ($str as xs:string)

as xs:string
{
 let $res := substring(replace($str, '(\d*(\.\d*)?),(\d*(\.\d*)?),(\d*(\.\d*)?) ?', ",$1 $3"), 2)
 return $res
};

let $doc := doc("../in/mapdata.kml")/Document
let $nameG := replace($doc/name, '"', '""')
let $comment := replace($doc/description, '"', '""')
for $mark in $doc//Placemark
return concat (
 $nameG, '###',
 $comment, '###',
 replace($mark//name, '"', '""'), '###',
 replace($mark//description, '"', '""'), '###',
 (if ($mark//Point)
 then concat ("POINT(", local:reduceDim($mark//coordinates), ')')
 else if ($mark//LineString)
 then concat ("LINESTRING(", local:reduceDim($mark//coordinates), ')')
 else
 concat ("POLYGON((", local:reduceDim($mark//coordinates), '))')),
 '&#xa;'
 )

Code der Datei import_maps.sh:

#!/bin/bash

HDIR="/cygdrive/y/fakultaet13/Romanistik/VerbaAlpina/import_mapdata"
export HDIR
PDIR="$HDIR/bin"
export PDIR
IN="$HDIR/in"
export IN
OUT="$HDIR/out"
export OUT

cd $PDIR

echo "Converting kml-file to csv-file ..."
echo ""

sed -i "s/<kml xmlns='http:\/\/www.opengis.net\/kml\/2.2'>//g" $IN/mapdata.kml
sed -i "s/<\/kml>//g" $IN/mapdata.kml
xquery -o mapdata.csv kml2csv.xql

sed -i 's/<?xml version="1.0" encoding="UTF-8"?>//g' mapdata.csv
sed -i 's/^[ \t]*//g' mapdata.csv
sed -i 's/[ \t]*$//g' mapdata.csv

mv mapdata.csv $OUT

echo ""
echo "Truncating table import_maps ..."
echo ""

mysql --defaults-file=~/.my.cnf -h gwi-sql2.gwi.uni-muenchen.de -P 3306 va_xxx -u slu --execute "truncate table import_maps;"

echo ""
echo "Importing data into table import_maps ..."
echo ""

cd $OUT

mysql --defaults-file=~/.my.cnf -h gwi-sql2.gwi.uni-muenchen.de -P 3306 va_xxx -u slu --execute "load data local infile 'mapdata.csv' into table import_maps fields terminated by '###' (col1,col2,col3,col4,col5);"

echo ""
echo "Transfering data to tables kommentare_orte and orte3 ..."
echo ""

mysql --defaults-file=~/.my.cnf -s -h gwi-sql2.gwi.uni-muenchen.de -P 3306 va_xxx -u slu --execute "insert into kommentare_orte (kategorie,kommentar_d,autor,timestamp) SELECT substring_index(col1,' # Autor: ',1) as Kategorie, col2 as kommentar_D, substring_index(col1,' # Autor: ',-1) as Autor, timestamp FROM import_maps limit 1; insert into orte3 (kategorie,name,beschreibung,geodaten,id_kommentar) SELECT substring_index(col1,' # Autor: ',1) as Kategorie, col3 as Name, col4 as Beschreibung, geomfromtext(col5) as Geodaten, last_insert_id() FROM import_maps; CALL zorte();"

echo ""
echo "... finished."
echo ""

exit 0

In der Datenbank werden die Daten der Karten in zwei Tabellen gespeichert. Die Informationen zur Karte als Ganzes werden in die Tabelle kommentare_orte geschrieben:


  Die Tabelle orte3 enthält sämtliche Markierungen der Gesamtkarte samt Kommentaren zu den Einzelpunkten (-linien, -polygonen). Der Zusammenhang zwischen den beiden Tabellen ist durch den gemeinsamen Wert im Feld id_kommentar hergestellt:

Schreibe einen Kommentar