Diskussion:PostGIS Terminal: Unterschied zwischen den Versionen

Aus Geoinformation HSR
Wechseln zu: Navigation, Suche
Zeile 1: Zeile 1:
 
Please note here your questions and feedback below. You can also send them directly to [http://gis.hsr.ch/index.php?option=com_contact&task=view&contact_id=2&Itemid=119 Stefan Keller].
 
Please note here your questions and feedback below. You can also send them directly to [http://gis.hsr.ch/index.php?option=com_contact&task=view&contact_id=2&Itemid=119 Stefan Keller].
  
=== XAPI-Tests ===  
+
== Feature Requests ==
 +
* Markers mit Maus-über ("hover") - wären toll... nicht Popup und wegklicken müssen! -
 +
* Features klickbar machen mit Link zu OSM mit osm_id, z.B. http://www.openstreetmap.org/browse/way/82142220
 +
* Data... Next update scheduled on ....
 +
* DB-unabhängig machen! D.h. "Weitere Parameter" (aus config.php) in HTML/Javascript laden.
 +
* DB Zugangsparameter mit Port und Zugangsweise (Text, TSL, SSL) erweitern.
 +
* Besseres Verwalten von Layern, die aus Map und Marker Queries entstanden sind.
 +
* Wie geht das mit Wait-Cursor in OpenLayers???
 +
 
 +
== More Queries... ==
 +
 
 +
=== Marker Queries ===
 +
  --- marker query (must have exactly field names lon, lat, title and description):
 +
  SELECT X(p2.way) AS lon, Y(p2.way) AS lat, 'Briefkasten' AS title, p2.ref AS description
 +
  FROM planet_osm_polygon p1
 +
  JOIN planet_osm_point p2 ON CONTAINS(p1.way, p2.way)
 +
  WHERE p1.name = 'Uster'
 +
  AND p2.amenity = 'post_box'
 +
 
 +
  --- Extension with user defined marker icon (attribute 'icon'):
 +
  SELECT X(p2.way) AS lon, Y(p2.way) AS lat, 'Briefkasten' AS title, p2.ref AS description, 'http://myserver/marker.png' as icon
 +
  FROM planet_osm_polygon p1
 +
  JOIN planet_osm_point p2 ON CONTAINS(p1.way, p2.way)
 +
  WHERE p1.name = 'Uster'
 +
  AND p2.amenity = 'post_box'
 +
 
 +
 
 +
=== All Tag-Value-Pairs of OSM data ===
 +
 
 +
Kann anstelle mit osm_point auch mit osm_all durchgeführt werden.
  
(HINWEIS: Das ist 'Work in Progress' für das Blackbox-Testing von XAPI-Webservices... Bitte ungeniert direkt unten ergänzen).
+
  --
 +
  -- Key-Value Statistics of OSM Data
 +
  -- Return all key-value-pairs of type 'enum' without some
 +
  -- types numeric, date/time etc. chosen by hand:
 +
  --
 +
  SELECT tmp.key||'='||tmp.value as kvp, count(*)::integer as freq
 +
  FROM (
 +
    SELECT (each(tags)).key as key, (each(tags)).value as value
 +
    FROM osm_point) as tmp
 +
  WHERE (trim(value) !~ '^[-]*[0-9,.:\ ]+[m]*$')
 +
  AND NOT (value ILIKE '%fixme%' OR key ILIKE '%fixme%')
 +
  AND key NOT LIKE '%:%'
 +
  AND key NOT LIKE '%description%'
 +
  AND key NOT LIKE '%comment%'
 +
  AND key NOT LIKE '%name'
 +
  AND key NOT LIKE 'uic_%'
 +
  AND key NOT LIKE '%ref'
 +
  AND key NOT ILIKE '%fixme%'
 +
  AND key NOT ILIKE '%todo%'
 +
  AND key NOT IN ('name','operator','_picture_','_waypoint_','address','alt','is_in','url','website','wikipedia','email',
 +
                  'converted_by','phone','information','opening_hours','date','time','collection_times','colour','fee',
 +
                  'population','access','noexit','towards','bus_routes','busline','lines','type','denotation',
 +
                  'CONTINUE','continue','copyright','stop')
 +
  GROUP BY tmp.key, tmp.value
 +
  HAVING COUNT(*) > 1
 +
  ORDER by key, freq DESC
 +
 
 +
----
 +
 
 +
== OSM Database Schematas ==
 +
 
 +
Original-Dokumentation der Schemata:
 +
* osm2pgsql schema: [http://wiki.openstreetmap.org/wiki/Osm2pgsql/schema osm2pgsql Schema] (default.style)
 +
* Original OSM schema: [http://trac.openstreetmap.org/browser/applications/utils/osmosis/trunk/package/script/pgsnapshot_schema_0.6.sql pgsnapshot_schema_0.6]
 +
* Artikel zum Laden von OSM Daten, "Loading OpenStreetMap data into PostGIS: An Almost Idiot's Guide": [http://www.bostongis.com/PrinterFriendly.aspx?content_name=loading_osm_postgis]
 +
 
 +
PostGIS-Terminal-Schema z.T. angepasst (wo überhaupt möglich) mittels der Konfigurations-Daten (.style):
 +
* Tabellen-Gruppe 'OSM-Original': Tabellen angelehnt an originale OSM-Planet-Struktur (jedoch mit Tags als Array):
 +
** osm_nodes => Node mit id, version, lat/lon, tags-Array (gem. default.style plus version)
 +
** osm_ways => Way mit Referenz auf Nodes, d.h. ohne eigene Geometrie (gem. default.style plus version)
 +
** osm_rels => Relation mit Referenz auf Nodes, Ways, Relations (gem. default.style plus version)
 +
* Tabellen-Gruppe 'Osm2pgsql': Tabellen mit Geometrien (PostGIS) zusammengestellt aus aus osm_nodes und osm_ways (mit Tags als hstore durch osm2pgsql '-h'-Flag ):
 +
** osm_point => Punktobjekte (nur Nodes, die Tags enthalten)
 +
** osm_line => Linienobjekte (mit 'echter' Geometrie, inkl. Ways, die eigentlich Flächen bilden)
 +
** osm_polygon => Flächenobjekte (gebildet aus bestimmten Ways und Relations)
 +
* Spezialtabellen
 +
** osm_roads => linienhafte Strassenobjekte (streichen aus .style)
 +
** osm_all => View als UNION von osm_point, osm_line und osm_polygon über die Kolonnen osm_id, name, tags, gtyp, way, osm_version (ACHTUNG: z.Zt. nicht-materialisiert, d.h. langsam!).
 +
** osm_poi (tbd.) => Tabelle als UNION-View über osm_point und osm_polygon mit ST_Centroid mit den Kolonnen osm_id, name, tags, gtyp, way, osm_version (materialisierte View).
 +
 
 +
Die Attribute osm_id und osm_version (aus Oms2pgsql-Option "-extended-attributes") in der Tabellen-Gruppe 'Osm2pgsql' können nicht umbenannt werden.
 +
 
 +
 
 +
== XAPI-to-Map ==
 +
 
 +
Die XAPI-to-Map-Funktion wandelt Anfragen in der Query-Sprache [[XAPI]] nach SQL um, fragt die OSM-Datenbank ab und stellt das Resultat direkt in der Webkarte dar. XAPI-to-Map ist - wie der Name sagt - kein Webservice (Maschine-Maschine) sondern eine Mensch-Maschine-Webapplikation. Die Syntax kennt häufige Requests, bestehend aus einem oder mehrerer Tag/Value-Paar sowie ggf. einer Bounding Box-Angabe. Nicht implementiert ist z.B. 'Union-Filter' (OR) im Key (node[amenity|leisure=golf_course]). Im Gegensatz zu anderen XAPI-Implementationn kann man dafür mehrere Filter-Prädikate angeben (z.B. node[amenity=golf_course]node[leisure=golf_course]).
 +
 
 +
Supported syntax elements:
 +
** Abbildung aller Tabellen sowie '*' (siehe Tabellen-Abbildungen unten)
 +
** Equality Filter (1x): way[highway=motorway]
 +
** Wildcard Filter: im Value way[highway=*]
 +
** BBox-Filter (1x): [bbox=left,bottom,right,top]
 +
** 'Union-Filter' (OR) im Value: way[highway=motorway|motorway_link|trunk|primary]
 +
** Mehrere Filter-Prädikate: node[amenity=golf_course]node[leisure=golf_course]
 +
 
 +
Notes:
 +
* Special query characters - except A-Z, a-z and " - must be "percent-encoded US-ASCII octet". There are online tools to help out like [http://urldecoder.waraxe.us/ this one]. (see [http://www.delicious.com/search?p=free+online+encoder]
 +
* It's not possible to do an OR query with nodes OR ways. This is a limitation of the XAPI syntax.
 +
 
 +
=== XAPI-Tests ===
 +
 
 +
Some test examples:
 
<tt>
 
<tt>
 +
  Use [[PostGIS Terminal]] for <postgisterminal_url>:
 +
  <postgisterminal_url>?xapi=node[tourism=zoo]</nowiki>
 +
  <postgisterminal_url>/?xapi=node[amenity=*][bbox=5.943,45.935,10.612,47.731]</nowiki>
 +
  <postgisterminal_url>/?xapi=node[highway=busstop]</nowiki>
 +
  <postgisterminal_url>/?xapi=node[amenity=hospital][bbox=-6,50,2,61]?zoom=18&lat=47.223&lon=8.822&layers=B0T</nowiki>
 +
  <postgisterminal_url>/?xapi=*[seamark:type=signal_station_warning]</nowiki>
 +
 +
  Use e.g. http://osm.xiala.net:8080/xapi/api/0.6 for a <xapi_service_url>:
 
   <xapi_service_url>/node[tourism=zoo]
 
   <xapi_service_url>/node[tourism=zoo]
 
   <xapi_service_url>/*[highway=bus_stop][bbox=5.943,45.935,10.612,47.731]
 
   <xapi_service_url>/*[highway=bus_stop][bbox=5.943,45.935,10.612,47.731]
Zeile 19: Zeile 127:
 
</tt>
 
</tt>
  
Wobei <tt><xapi_service_url></tt> (hier ohne Slash am Ende) ein konkreter XAPI-Webservice ist, namentlich: http://osm.xiala.net:8080/xapi/api/0.6 oder http://152.96.80.16 .
+
== Original XAPI-Dokumentation und andere XAPI-Server ==
 
 
Siehe auch die [http://jxapi.openstreetmap.org/xapi/admin/stats  JXAPI-Logs] (live!) sowie den [http://fsi.spline.de/osm/xapi-access-23-01-2011.log.bz2 Log-Backup von XAPI] mit unbestätigter Herkunft.
 
 
 
== XAPI-to-Map ==
 
 
 
Das Ziel dieser Webapp bzw. Funktion ist das Umwandeln von OSM [[XAPI]] Requests nach SQL mit anschliessender Darstellung als Webkarte. Das Ziel ist nicht ein eigentlicher Webservice und auch nicht die Umsetzung der vollständigen "Syntax". Realisiert werden nur spezifische und häufige Requests, bestehend aus einem Tag/Value-Paar sowie ggf. einer Bounding Box-Angabe.
 
  
Hier einige Beispiele (geplant):
 
* <nowiki>http://152.96.80.16/?xapi=node[tourism=zoo]</nowiki>
 
* <nowiki>http://152.96.80.16/?xapi=node[amenity=*][bbox=5.943,45.935,10.612,47.731]</nowiki>
 
* <nowiki>http://152.96.80.16/?xapi=node[highway=busstop]</nowiki>
 
* <nowiki>http://152.96.80.16/?xapi=node[amenity=hospital][bbox=-6,50,2,61]?zoom=18&lat=47.223&lon=8.822&layers=B0T</nowiki>
 
* <nowiki>http://152.96.80.16/?xapi=*[seamark:type=signal_station_warning]</nowiki>
 
 
Zu realisierende Syntaxelemente:
 
* Prio. 1:
 
** Abbildung aller Tabellen sowie '*' (siehe Tabellen-Abbildungen unten)
 
** Equality Filter (1x): way[highway=motorway]
 
** Wildcard Filter: im Value way[highway=*]
 
* Prio. 2:
 
** BBox-Filter (1x): [bbox=left,bottom,right,top]
 
** 'Union-Filter' (OR) im Value: way[highway=motorway|motorway_link|trunk|primary]
 
* Prio. 3:
 
** Mehrere Filter-Prädikate: node[amenity=golf_course]node[leisure=golf_course]
 
** 'Union-Filter' (OR) im Key: node[amenity|leisure=golf_course]
 
 
Response:
 
* Karte
 
* Ev. muss die DB mit dem Attribut version ergänzt werden: Dazu bei osm2pgsql -x angeben und default.style anpassen (nur version, die anderen nicht).
 
 
Implementations-Details:
 
* Wegen '[', '*' sowie ':' (in Keys wie 'name:de') muss die URL kanonisiert werden?
 
* Spaces sind in Values auch zugelassen, vgl. node[name=Knie's Kinderzoo]
 
* das XAPI-to-Map funktioniert auch mit Permalink, z.B. node[amenity=hospital][bbox=-6,50,2,61]?zoom=18&lat=47.223&lon=8.822&layers=B0T
 
 
=== XAPI-Beispiele ===
 
 
Hier konkrete, laufende XAPI-Beispiele:
 
Hier konkrete, laufende XAPI-Beispiele:
 
* jXAPI (weltweit): http://jxapi.openstreetmap.org/xapi/api/0.6/*%5Btourism=zoo%5D%5Bbbox=5.943,45.935,10.612,47.731%5D
 
* jXAPI (weltweit): http://jxapi.openstreetmap.org/xapi/api/0.6/*%5Btourism=zoo%5D%5Bbbox=5.943,45.935,10.612,47.731%5D
Zeile 65: Zeile 138:
 
** http://xapi.openstreetmap.org/api/0.6/*%tourism=zoo%5D%5Bbbox=5.943,45.935,10.612,47.731%5D
 
** http://xapi.openstreetmap.org/api/0.6/*%tourism=zoo%5D%5Bbbox=5.943,45.935,10.612,47.731%5D
  
=== XAPI-Dokumentation ===
+
XAPI-Dokumentation:
 
 
 
* [[XAPI]]
 
* [[XAPI]]
 
* Query-Syntax: ANTRL-Syntax [https://github.com/iandees/xapi-antlr/blob/master/src/main/antlr3/com/yellowbkpk/geo/xapi/antlr/XAPI.g], Query-Parser in Python [http://gitorious.org/osm-poi-tools/server/blobs/master/list/views.py]
 
* Query-Syntax: ANTRL-Syntax [https://github.com/iandees/xapi-antlr/blob/master/src/main/antlr3/com/yellowbkpk/geo/xapi/antlr/XAPI.g], Query-Parser in Python [http://gitorious.org/osm-poi-tools/server/blobs/master/list/views.py]
 
* JXAPI-Logs (live!): http://jxapi.openstreetmap.org/xapi/admin/stats sowie [http://fsi.spline.de/osm/xapi-access-23-01-2011.log.bz2 Log-Backup von XAPI] (unbestätigter Herkunft).
 
* JXAPI-Logs (live!): http://jxapi.openstreetmap.org/xapi/admin/stats sowie [http://fsi.spline.de/osm/xapi-access-23-01-2011.log.bz2 Log-Backup von XAPI] (unbestätigter Herkunft).
* Häufige Anfragen gemäss Logs:
 
** *[amenity=*]
 
** *[highway=bus_stop]
 
** *[shop=*]
 
** *[tourism=*]
 
** node[railway=station]
 
** relation[type=restriction]
 
  
Note: Query-Zeichen müssen "percent-encoded US-ASCII octet" sein. Eine Hilfe dazu bietet
+
Häufige Anfragen gemäss Logs:
 +
* *[amenity=*]
 +
* *[highway=bus_stop]
 +
* *[shop=*]
 +
* *[tourism=*]
 +
* node[railway=station]
 +
* relation[type=restriction]
 +
 
  
=== DB-Schema ===
+
== PostGIS-Terminal Documentation ==
Generiert durch osm2pgsql:
 
* Tabellen angelehnt an originale OSM-Planet-Struktur (jedoch mit Tags als Array):
 
** osm_nodes => Node mit id, version, lat/lon, tags-Array (gem. default.style plus version)
 
** osm_ways => Way mit Referenz auf Nodes, d.h. ohne eigene Geometrie (gem. default.style plus version)
 
** osm_rels => Relation mit Referenz auf Nodes, Ways, Relations (gem. default.style plus version)
 
* Tabellen mit Geometrien (PostGIS) zusammengestellt aus aus osm_nodes und osm_ways (mit Tags als hstore durch osm2pgsql '-h'-Flag ):
 
** osm_point => Punktobjekte (nur Nodes, die Tags enthalten)
 
** osm_line => Linienobjekte (mit 'echter' Geometrie, inkl. Ways, die eigentlich Flächen bilden)
 
** osm_polygon => Flächenobjekte (gebildet aus bestimmten Ways und Relations)
 
* Spezialtabellen
 
** osm_roads => linienhafte Strassenobjekte (streichen aus default-style)
 
** osm_all => View als UNION von osm_point, osm_line und osm_polygon über die Kolonnen osm_id, name, tags, gtyp, way, osm_version (ACHTUNG: z.Zt. nicht-materialisiert, d.h. langsam!).
 
** osm_poi (tbd.) => Tabelle als UNION-View über osm_point und osm_polygon mit ST_Centroid mit den Kolonnen osm_id, name, tags, gtyp, way, osm_version (materialisierte View).
 
  
=== Abbildung XAPI => SQL ===
+
=== XAPI-to-Map ===
  
 
Tabellen-Abbildungen auf Basis osm2pgsql-Schema, die dann Grundlage der:
 
Tabellen-Abbildungen auf Basis osm2pgsql-Schema, die dann Grundlage der:
Zeile 103: Zeile 162:
 
* relation => osm_rels
 
* relation => osm_rels
 
* '*' => osm_all  
 
* '*' => osm_all  
 
  Todo RMI:
 
  * Ev. Zusätzliche Views, Tabellen und Indexes anlegen.
 
  * Primary Keys prüfen! Bei mir hatten osm_point, osm_line, osm_polygon keine!!
 
  * Prüfen was schneller ist: DROP osm_node und all das CREATE... oder TRUNCATE TABLE osm_node und INSERT...
 
  * osm_roads => streichen aus default-style?
 
  * Mir das Skript mit allen Tabellen und Grants schicken
 
  
 
XAPI-zu-SQL-Abbildungen:
 
XAPI-zu-SQL-Abbildungen:
Zeile 115: Zeile 167:
 
* equality search becomes AND hstore(tags)->'key' = 'value'
 
* equality search becomes AND hstore(tags)->'key' = 'value'
 
* wildcard search becomes AND hstore(tags)?'fee'
 
* wildcard search becomes AND hstore(tags)?'fee'
 +
* Passend dazu SQL-Requests https://github.com/osm-spline/xapi/blob/master/sql/sampleRequests.sql
  
Original wird das OSM-Schema verwendet, das auch version, timestamp, uid, user, changeset liefert. V.a. version wäre noch wichtig, um die Daten editiert wieder hochzuladen (dann mit version+=1).
+
Implementations-Details:
* daher => '''ausprobieren, ob osm2pgsql im Slim-mode auch 'version' als Attribut in den Zieltabellen speichern kann'''.
+
* Wegen '[', '*' sowie ':' (in Keys wie 'name:de') muss die URL kanonisiert werden?
* [http://wiki.openstreetmap.org/wiki/Osm2pgsql/schema osm2pgsql Schema] (default.style)
+
* Spaces sind in Values auch zugelassen, vgl. node[name=Knie's Kinderzoo]
* [http://trac.openstreetmap.org/browser/applications/utils/osmosis/trunk/package/script/pgsnapshot_schema_0.6.sql pgsnapshot_schema_0.6]
+
* das XAPI-to-Map funktioniert auch mit Permalink, z.B. node[amenity=hospital][bbox=-6,50,2,61]?zoom=18&lat=47.223&lon=8.822&layers=B0T
* Passend dazu SQL-Requests https://github.com/osm-spline/xapi/blob/master/sql/sampleRequests.sql
+
* Für häufige Abrafen siehe auch die [http://jxapi.openstreetmap.org/xapi/admin/stats  JXAPI-Logs] (live!) sowie den [http://fsi.spline.de/osm/xapi-access-23-01-2011.log.bz2 Log-Backup von XAPI] mit unbestätigter Herkunft.
 +
* Ev. Zusätzliche Views, Tabellen und Indexes anlegen.
 +
* Primary Keys prüfen! Bei mir hatten osm_point, osm_line, osm_polygon keine!!
 +
* Prüfen was schneller ist: DROP osm_node und all das CREATE... oder TRUNCATE TABLE osm_node und INSERT...  
 +
* osm_roads => streichen aus default-style?
  
 
Beispiel (man beachte, dass nicht der '->'- sondern der '@>'-Operator verwendet wird wegen GiST-Index):
 
Beispiel (man beachte, dass nicht der '->'- sondern der '@>'-Operator verwendet wird wegen GiST-Index):
Zeile 133: Zeile 190:
 
   <nowiki>.../way[xxx]</nowiki>
 
   <nowiki>.../way[xxx]</nowiki>
 
   wird abgebildet auf osm_line (oder osm_polygon?)
 
   wird abgebildet auf osm_line (oder osm_polygon?)
 
== Weitere interessante Queries ==
 
 
=== Alle Tag-Value-Paare der OSM-Daten ===
 
 
Kann anstelle mit osm_point auch mit osm_all durchgeführt werden.
 
 
  --
 
  -- Key-Value Statistics of OSM Data
 
  -- Return all key-value-pairs of type 'enum' without some
 
  -- types numeric, date/time etc. chosen by hand:
 
  --
 
  SELECT tmp.key||'='||tmp.value as kvp, count(*)::integer as freq
 
  FROM (
 
    SELECT (each(tags)).key as key, (each(tags)).value as value
 
    FROM osm_point) as tmp
 
  WHERE (trim(value) !~ '^[-]*[0-9,.:\ ]+[m]*$')
 
  AND NOT (value ILIKE '%fixme%' OR key ILIKE '%fixme%')
 
  AND key NOT LIKE '%:%'
 
  AND key NOT LIKE '%description%'
 
  AND key NOT LIKE '%comment%'
 
  AND key NOT LIKE '%name'
 
  AND key NOT LIKE 'uic_%'
 
  AND key NOT LIKE '%ref'
 
  AND key NOT ILIKE '%fixme%'
 
  AND key NOT ILIKE '%todo%'
 
  AND key NOT IN ('name','operator','_picture_','_waypoint_','address','alt','is_in','url','website','wikipedia','email',
 
                  'converted_by','phone','information','opening_hours','date','time','collection_times','colour','fee',
 
                  'population','access','noexit','towards','bus_routes','busline','lines','type','denotation',
 
                  'CONTINUE','continue','copyright','stop')
 
  GROUP BY tmp.key, tmp.value
 
  HAVING COUNT(*) > 1
 
  ORDER by key, freq DESC
 
 
=== Artikel zum Laden von OSM Daten ===
 
Loading OpenStreetMap data into PostGIS: An Almost Idiot's Guide: [http://www.bostongis.com/PrinterFriendly.aspx?content_name=loading_osm_postgis]
 
 
== Feature Requests ==
 
  
 
=== Security Features ===
 
=== Security Features ===
SF1. Rechte entziehen, damit User Tables und Views nicht erzeugen oder löschen können!!!  
+
GRANTS: Rechte entziehen, damit User Tables und Views nicht erzeugen oder löschen können!
 
   Schema nicht PUBLIC? Test: create table customer (id serial, name text); drop table customer; !!!
 
   Schema nicht PUBLIC? Test: create table customer (id serial, name text); drop table customer; !!!
 
   Konfigurieren PostgreSQL Server (postgresql.conf parameters): Disabling autovacuum daemon, fsync=off etc.
 
   Konfigurieren PostgreSQL Server (postgresql.conf parameters): Disabling autovacuum daemon, fsync=off etc.
=> RMI
 
  
SF2. Einbau Timeout als Parameter der PostgreSQL-Verbindung in process-query.php (oder als "statement_timeout (60000)" in postgresql.conf); siehe [http://www.postgresql.org/docs/9.0/interactive/runtime-config-client.html]  
+
DB-Server-Timeout: als Parameter der PostgreSQL-Verbindung in process-query.php (oder als "statement_timeout (60000)" in postgresql.conf); siehe [http://www.postgresql.org/docs/9.0/interactive/runtime-config-client.html]  
 
   SET STATEMENT_TIMEOUT TO 60000;
 
   SET STATEMENT_TIMEOUT TO 60000;
 
   SET transaction_read_only TO TRUE;
 
   SET transaction_read_only TO TRUE;
 
   ALTER DATABASE x SET default_transaction_read_only = on;
 
   ALTER DATABASE x SET default_transaction_read_only = on;
  
=> RMI
+
Logging: Log von IP, Query-String und Response-Infos (success/error/etc. und Prozess-Zeit) speichert. Lösung über process-query.php oder Analyse (grep) Apache-Log?
 +
 
 +
=== Data Features ===
  
SF3. Logging, das IP, Query-String und Response-Infos (success/error/etc. und Prozess-Zeit) speichert. Lösung über process-query.php oder Analyse (grep) Apache-Log?
+
Schema configuration: Style-Datei anpassen, so dass Tabellennamen ohne "planet" und ohne Underscores erzeugt werden, also z.B. anstelle „planet_osm_point“ nur „osmpoint“.
=> RMI
 
  
=== Data Features ===
+
Associative Array: hstore (-h Parameter bei osm2pgsql)
DF1. Style-Datei anpassen, so dass Tabellennamen ohne "planet" und ohne Underscores erzeugt werden, also z.B. anstelle „planet_osm_point“ nur „osmpoint“.
+
 
=> RMI
+
Additional Views and Tables:
  
DF2. Neu immer Laden mit hstore (-h Parameter bei osm2pgsql). Zudem folgende Tabelle hinzufügen:
 
 
   CREATE VIEW osm_all AS  
 
   CREATE VIEW osm_all AS  
 
   SELECT osm_id, name, tags, 'pt' AS gtyp, way
 
   SELECT osm_id, name, tags, 'pt' AS gtyp, way
Zeile 214: Zeile 232:
 
   VACUUM FREEZE ANALYZE;  -- das kann dauern...
 
   VACUUM FREEZE ANALYZE;  -- das kann dauern...
  
=> RMI
+
Nightly Update: Einrichten eines Cron-Jobs, der einmal pro Nacht die Schweiz neu einspielt (Bitte Vorschlag).
  
DF3. Einrichten eines Cron-Jobs, der einmal pro Nacht die Schweiz neu einspielt (Bitte Vorschlag).
+
Webservice indicatind database update time and a list of tables => about-db-query.php
=> RMI
 
  
DF4. Siehe NF2.
+
Marker Query with attribute 'icon', mit dem man Icons von externen Quellen (url) darstellen kann.
=> RMI
 
 
 
=== New Functionality/Refactoring ===
 
 
 
NF1. Refactoring Marker Query from Text class to Vector Class (see Test Cases for Marker Query below).
 
=> Kemper/Hengartner
 
 
 
NF2. „Updated: 2011-03-25“ ist zurzeit fix in config.php festgehalten und wird über "?" angezeigt. Schöner wäre eine Anzeige über eine DB-Query (about-db-query.php).
 
 
 
NF3. Anzeige/Einfügen Tabellen und -Attribute als <options...> (laden via about-db-query.php).
 
 
 
NF4. Erweiterung Marker Query um Attribut 'icon', mit dem man Icons von externen Quellen (url) darstellen kann. => erledigt.
 
 
 
=== Nice-to-have ===
 
* Data... Next update scheduled on ....
 
* Umwandeln von OSM [[XAPI]] ('zappy') Requests nach SQL (SELECT FROM WHERE...) - auch als Ergänzung des Permalinks.
 
* Features klickbar machen mit Link zu OSM mit osm_id, z.B. http://www.openstreetmap.org/browse/way/82142220
 
* Vollständig DB-unabhängig machen! D.h. "Weitere Parameter" (aus config.php) in HTML/Javascript laden.
 
* DB Zugangsparameter mit Port und Zugangsweise (Text, TSL, SSL) erweitern.
 
* Besseres Verwalten von Layern, die aus Map und Marker Queries entstanden sind.
 
* Markers mit Maus-über ("hover") - wären toll... nicht Popup und wegklicken müssen! -
 
* Wie geht das mit Wait-Cursor in OpenLayers???
 
* Aufrufen von Google Earth (KML network link), falls output mit ST_KML und alias kml (als einzigem Ausgabe-Feld) angegeben.
 
 
 
== Test Cases for Marker Query ==
 
  --- marker query (must have exactly field names lon, lat, title and description):
 
  SELECT X(p2.way) AS lon, Y(p2.way) AS lat, 'Briefkasten' AS title, p2.ref AS description
 
  FROM planet_osm_polygon p1
 
  JOIN planet_osm_point p2 ON CONTAINS(p1.way, p2.way)
 
  WHERE p1.name = 'Uster'
 
  AND p2.amenity = 'post_box'
 
 
 
  --- Extension with user defined marker icon (attribute 'icon'):
 
  SELECT X(p2.way) AS lon, Y(p2.way) AS lat, 'Briefkasten' AS title, p2.ref AS description, 'http://myserver/marker.png' as icon
 
  FROM planet_osm_polygon p1
 
  JOIN planet_osm_point p2 ON CONTAINS(p1.way, p2.way)
 
  WHERE p1.name = 'Uster'
 
  AND p2.amenity = 'post_box'
 

Version vom 23. Juli 2011, 13:04 Uhr

Please note here your questions and feedback below. You can also send them directly to Stefan Keller.

Feature Requests

  • Markers mit Maus-über ("hover") - wären toll... nicht Popup und wegklicken müssen! -
  • Features klickbar machen mit Link zu OSM mit osm_id, z.B. http://www.openstreetmap.org/browse/way/82142220
  • Data... Next update scheduled on ....
  • DB-unabhängig machen! D.h. "Weitere Parameter" (aus config.php) in HTML/Javascript laden.
  • DB Zugangsparameter mit Port und Zugangsweise (Text, TSL, SSL) erweitern.
  • Besseres Verwalten von Layern, die aus Map und Marker Queries entstanden sind.
  • Wie geht das mit Wait-Cursor in OpenLayers???

More Queries...

Marker Queries

 --- marker query (must have exactly field names lon, lat, title and description):
 SELECT X(p2.way) AS lon, Y(p2.way) AS lat, 'Briefkasten' AS title, p2.ref AS description
 FROM planet_osm_polygon p1
 JOIN planet_osm_point p2 ON CONTAINS(p1.way, p2.way)
 WHERE p1.name = 'Uster'
 AND p2.amenity = 'post_box'
 --- Extension with user defined marker icon (attribute 'icon'):
 SELECT X(p2.way) AS lon, Y(p2.way) AS lat, 'Briefkasten' AS title, p2.ref AS description, 'http://myserver/marker.png' as icon 
 FROM planet_osm_polygon p1
 JOIN planet_osm_point p2 ON CONTAINS(p1.way, p2.way)
 WHERE p1.name = 'Uster'
 AND p2.amenity = 'post_box'


All Tag-Value-Pairs of OSM data

Kann anstelle mit osm_point auch mit osm_all durchgeführt werden.

 --
 -- Key-Value Statistics of OSM Data
 -- Return all key-value-pairs of type 'enum' without some 
 -- types numeric, date/time etc. chosen by hand:
 --
 SELECT tmp.key||'='||tmp.value as kvp, count(*)::integer as freq 
 FROM (
   SELECT (each(tags)).key as key, (each(tags)).value as value 
   FROM osm_point) as tmp
 WHERE (trim(value) !~ '^[-]*[0-9,.:\ ]+[m]*$')
 AND NOT (value ILIKE '%fixme%' OR key ILIKE '%fixme%')
 AND key NOT LIKE '%:%'
 AND key NOT LIKE '%description%'
 AND key NOT LIKE '%comment%'
 AND key NOT LIKE '%name'
 AND key NOT LIKE 'uic_%'
 AND key NOT LIKE '%ref'
 AND key NOT ILIKE '%fixme%'
 AND key NOT ILIKE '%todo%'
 AND key NOT IN ('name','operator','_picture_','_waypoint_','address','alt','is_in','url','website','wikipedia','email',
                 'converted_by','phone','information','opening_hours','date','time','collection_times','colour','fee',
                 'population','access','noexit','towards','bus_routes','busline','lines','type','denotation',
                 'CONTINUE','continue','copyright','stop')
 GROUP BY tmp.key, tmp.value
 HAVING COUNT(*) > 1
 ORDER by key, freq DESC

OSM Database Schematas

Original-Dokumentation der Schemata:

PostGIS-Terminal-Schema z.T. angepasst (wo überhaupt möglich) mittels der Konfigurations-Daten (.style):

  • Tabellen-Gruppe 'OSM-Original': Tabellen angelehnt an originale OSM-Planet-Struktur (jedoch mit Tags als Array):
    • osm_nodes => Node mit id, version, lat/lon, tags-Array (gem. default.style plus version)
    • osm_ways => Way mit Referenz auf Nodes, d.h. ohne eigene Geometrie (gem. default.style plus version)
    • osm_rels => Relation mit Referenz auf Nodes, Ways, Relations (gem. default.style plus version)
  • Tabellen-Gruppe 'Osm2pgsql': Tabellen mit Geometrien (PostGIS) zusammengestellt aus aus osm_nodes und osm_ways (mit Tags als hstore durch osm2pgsql '-h'-Flag ):
    • osm_point => Punktobjekte (nur Nodes, die Tags enthalten)
    • osm_line => Linienobjekte (mit 'echter' Geometrie, inkl. Ways, die eigentlich Flächen bilden)
    • osm_polygon => Flächenobjekte (gebildet aus bestimmten Ways und Relations)
  • Spezialtabellen
    • osm_roads => linienhafte Strassenobjekte (streichen aus .style)
    • osm_all => View als UNION von osm_point, osm_line und osm_polygon über die Kolonnen osm_id, name, tags, gtyp, way, osm_version (ACHTUNG: z.Zt. nicht-materialisiert, d.h. langsam!).
    • osm_poi (tbd.) => Tabelle als UNION-View über osm_point und osm_polygon mit ST_Centroid mit den Kolonnen osm_id, name, tags, gtyp, way, osm_version (materialisierte View).

Die Attribute osm_id und osm_version (aus Oms2pgsql-Option "-extended-attributes") in der Tabellen-Gruppe 'Osm2pgsql' können nicht umbenannt werden.


XAPI-to-Map

Die XAPI-to-Map-Funktion wandelt Anfragen in der Query-Sprache XAPI nach SQL um, fragt die OSM-Datenbank ab und stellt das Resultat direkt in der Webkarte dar. XAPI-to-Map ist - wie der Name sagt - kein Webservice (Maschine-Maschine) sondern eine Mensch-Maschine-Webapplikation. Die Syntax kennt häufige Requests, bestehend aus einem oder mehrerer Tag/Value-Paar sowie ggf. einer Bounding Box-Angabe. Nicht implementiert ist z.B. 'Union-Filter' (OR) im Key (node[amenity|leisure=golf_course]). Im Gegensatz zu anderen XAPI-Implementationn kann man dafür mehrere Filter-Prädikate angeben (z.B. node[amenity=golf_course]node[leisure=golf_course]).

Supported syntax elements:

    • Abbildung aller Tabellen sowie '*' (siehe Tabellen-Abbildungen unten)
    • Equality Filter (1x): way[highway=motorway]
    • Wildcard Filter: im Value way[highway=*]
    • BBox-Filter (1x): [bbox=left,bottom,right,top]
    • 'Union-Filter' (OR) im Value: way[highway=motorway|motorway_link|trunk|primary]
    • Mehrere Filter-Prädikate: node[amenity=golf_course]node[leisure=golf_course]

Notes:

  • Special query characters - except A-Z, a-z and " - must be "percent-encoded US-ASCII octet". There are online tools to help out like this one. (see [2]
  • It's not possible to do an OR query with nodes OR ways. This is a limitation of the XAPI syntax.

XAPI-Tests

Some test examples:

 Use PostGIS Terminal for <postgisterminal_url>:
 <postgisterminal_url>?xapi=node[tourism=zoo]</nowiki> 
 <postgisterminal_url>/?xapi=node[amenity=*][bbox=5.943,45.935,10.612,47.731]</nowiki>
 <postgisterminal_url>/?xapi=node[highway=busstop]</nowiki>
 <postgisterminal_url>/?xapi=node[amenity=hospital][bbox=-6,50,2,61]?zoom=18&lat=47.223&lon=8.822&layers=B0T</nowiki>
 <postgisterminal_url>/?xapi=*[seamark:type=signal_station_warning]</nowiki>
 Use e.g. http://osm.xiala.net:8080/xapi/api/0.6 for a <xapi_service_url>:
 <xapi_service_url>/node[tourism=zoo]
 <xapi_service_url>/*[highway=bus_stop][bbox=5.943,45.935,10.612,47.731]
 <xapi_service_url>/node[amenity=hospital]
 <xapi_service_url>/node[natural=peak]
 <xapi_service_url>/*[power_source=nuclear]
 <xapi_service_url>/node[amenity=*][bbox=5.943,45.935,10.612,47.731] 
 <xapi_service_url>/*[seamark:type=signal_station_warning]
 <xapi_service_url>/*[amenity=*][bbox=8.420,47.072,9.088,47.431]
 <xapi_service_url>/*[shop=*][bbox=8.420,47.072,9.088,47.431]
 <xapi_service_url>/*[tourism=*][bbox=8.420,47.072,9.088,47.431]
 <xapi_service_url>/node[railway=station][bbox=8.420,47.072,9.088,47.431]
 <xapi_service_url>/relation[type=restriction][bbox=8.420,47.072,9.088,47.431]

Original XAPI-Dokumentation und andere XAPI-Server

Hier konkrete, laufende XAPI-Beispiele:

XAPI-Dokumentation:

Häufige Anfragen gemäss Logs:

  • *[amenity=*]
  • *[highway=bus_stop]
  • *[shop=*]
  • *[tourism=*]
  • node[railway=station]
  • relation[type=restriction]


PostGIS-Terminal Documentation

XAPI-to-Map

Tabellen-Abbildungen auf Basis osm2pgsql-Schema, die dann Grundlage der:

  • point, line, polygon => osm_point, osm_line, osm_polygon (zusätzlich zur XAPI-Syntax).
  • node => osm_point
  • way => osm_polygon
  • relation => osm_rels
  • '*' => osm_all

XAPI-zu-SQL-Abbildungen:

Implementations-Details:

  • Wegen '[', '*' sowie ':' (in Keys wie 'name:de') muss die URL kanonisiert werden?
  • Spaces sind in Values auch zugelassen, vgl. node[name=Knie's Kinderzoo]
  • das XAPI-to-Map funktioniert auch mit Permalink, z.B. node[amenity=hospital][bbox=-6,50,2,61]?zoom=18&lat=47.223&lon=8.822&layers=B0T
  • Für häufige Abrafen siehe auch die JXAPI-Logs (live!) sowie den Log-Backup von XAPI mit unbestätigter Herkunft.
  • Ev. Zusätzliche Views, Tabellen und Indexes anlegen.
  • Primary Keys prüfen! Bei mir hatten osm_point, osm_line, osm_polygon keine!!
  • Prüfen was schneller ist: DROP osm_node und all das CREATE... oder TRUNCATE TABLE osm_node und INSERT...
  • osm_roads => streichen aus default-style?

Beispiel (man beachte, dass nicht der '->'- sondern der '@>'-Operator verwendet wird wegen GiST-Index):

 .../node[tourism=zoo][bbox=6.2,46.1,10.0,47.6]
 wird abgebildet auf: 
 SELECT ST_AsText(way) geom, name||' '||osm_id label
 FROM osm_point
 WHERE tags @> hstore('tourism','zoo') -- nicht hstore(tags)->'tourism' = 'zoo'
 -- OR ... abhängig von XAPI-Syntax
 AND ST_Contains(ST_Transform(ST_SetSRID('BOX(6.2 46.1, 10.0 47.6)'::box2d, 4326),900913),way)
 .../way[xxx]
 wird abgebildet auf osm_line (oder osm_polygon?)

Security Features

GRANTS: Rechte entziehen, damit User Tables und Views nicht erzeugen oder löschen können!

 Schema nicht PUBLIC? Test: create table customer (id serial, name text); drop table customer; !!!
 Konfigurieren PostgreSQL Server (postgresql.conf parameters): Disabling autovacuum daemon, fsync=off etc.

DB-Server-Timeout: als Parameter der PostgreSQL-Verbindung in process-query.php (oder als "statement_timeout (60000)" in postgresql.conf); siehe [5]

 SET STATEMENT_TIMEOUT TO 60000;
 SET transaction_read_only TO TRUE;
 ALTER DATABASE x SET default_transaction_read_only = on;

Logging: Log von IP, Query-String und Response-Infos (success/error/etc. und Prozess-Zeit) speichert. Lösung über process-query.php oder Analyse (grep) Apache-Log?

Data Features

Schema configuration: Style-Datei anpassen, so dass Tabellennamen ohne "planet" und ohne Underscores erzeugt werden, also z.B. anstelle „planet_osm_point“ nur „osmpoint“.

Associative Array: hstore (-h Parameter bei osm2pgsql)

Additional Views and Tables:

 CREATE VIEW osm_all AS 
 SELECT osm_id, name, tags, 'pt' AS gtyp, way
 FROM osm_point
 UNION
 SELECT osm_id, name, tags, 'ln' AS gtyp, way
 FROM osm_line
 UNION
 SELECT osm_id, name, tags, 'po' AS gtyp, way
 FROM osm_polygon
 CREATE INDEX osm_point_name_idx
 ON osm_point(name) WITH (FILLFACTOR=100);
 CREATE INDEX osm_point_tags_idx
 ON osm_point USING gist(tags) WITH (FILLFACTOR=100);
 -- Kann "FEHLER:  invalid hstore value found" ergeben!
 
 ALTER TABLE osm_point CLUSTER ON osm_point_name_idx;
 VACUUM FREEZE ANALYZE;  -- das kann dauern...

Nightly Update: Einrichten eines Cron-Jobs, der einmal pro Nacht die Schweiz neu einspielt (Bitte Vorschlag).

Webservice indicatind database update time and a list of tables => about-db-query.php

Marker Query with attribute 'icon', mit dem man Icons von externen Quellen (url) darstellen kann.