Diskussion:PostGIS Terminal: Unterschied zwischen den Versionen

Aus Geoinformation HSR
Wechseln zu: Navigation, Suche
(Abbildung XAPI => SQL)
K
 
(142 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
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 ===  
+
== Task List ==
  
(HINWEIS: Das ist 'Work in Progress' für das Blackbox-Testing von XAPI-Webservices... Bitte ungeniert direkt unten ergänzen).
+
Siehe auch [[Diskussion:EOSMDBOne#Task List]].
<tt>
 
  <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]
 
</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 .
+
* BUG: Permalink funktioniert nicht: Erzeugt zurzeit ?xapi=*%5Bamenity%253Dbicycle_parking%5D&zoom=18&lat=47.22315&lon=8.81703&layers=B0T statt ?xapi=*[amenity%3Dbicycle_parking]&zoom=18&lat=47.22315&lon=8.81703&layers=B0T
 +
* BUG: ST_Relate funktioniert auf IE nicht.
 +
* <s>Zusätzliche Weblinks: | Permalink | OSM | OpenPOIMap |
 +
** OSM: http:// www.openstreetmap.org/?zoom=18&lat=47.22315&lon=8.81703&layers=B0T
 +
** OpenPOIMap http:// openpoimap.ch/?zoom=17&lat=47.22577&lon=8.81572&xapi=*[amenity=bicycle_parking]
 +
* In Fusszeile statt "GISpunkt HSR" neu "Geometa Lab HSR" wobei der Weblink neu http://wiki.hsr.ch/StefanKeller/wiki.cgi?GeometaLab heisst.</s>
 +
* Syntax-Erweiterung:
 +
** Zusätzlich zu 'node', 'way', 'rel' und '*' (=all) soll auch die (fast) gleichnamige Tabelle 'poi' angegeben werden können.
 +
** Vergleichsoperator '!=' (=IsNotEqualTo) bei Values. Bsp.: ?xapi=node[cuisine!=pizza].
 +
** Logischer Operator '|' (= OR) bei Tags - analog zum "union" operator für Values: Bsp.: ?xapi=node[amenity=restaurant]|[tourism=office]
  
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.
+
== History ==
 +
* <s>ST_Relate einbauen</s>.
 +
* <s>Anzeigen Datum und neu Zeit (via about-db-query.php)</s>
 +
* <s>Signalisieren, wenn DB offline ist (via about-db-query.php)</s>
 +
* <s>Bug: Seit dem letzten Code-Update scheinen die vordefinerten Queries (vgl. "SQL Composer" auf Startseite) nicht mehr zu funktionieren. Bei den „Examples“ hat es zwei gleiche Einträge (mit unterschiedlichen SQLs) und die vordefinierte Variable für Geometrieattribut heisst linestring (statt way).</s>
 +
* <s>XAPI (Links): XAPI-to-Map-URLs sollen in Mails und Wikis eingebettet werden können (daher '[[PostGIS_Terminal#XAPI-to-Map]]'). D.h. kanonisierte URLs sollten ebenfalls funktionieren, z.B. <nowiki>http://labs.geometa.info/postgisterminal/?xapi=node%5Btourism=zoo%5D<> (auch "Permalink" kanonisiert die XAPI-Syntax (<nowiki>['=']</nowiki>). </s>
 +
* <s>Kontext-Menu (= "Right Click") in der Karte entweder disablen oder idealerweise mit Funktionen belegen (ähnlich Google Maps) wie "Zoom in, Zoom out, Karte hier zentrieren" (sobald auf [[OpenPOIMap]] implementiert).</s>
 +
* <s>Relate exemplified:</s>
 +
** <s>Unten bedeutet “ptV ptV TTTTTTTT (+)” folgendes:</s>
 +
** <s>ptV ist ein Auswahlfeld/Pulldownliste mit pt als Default. Nebst pt gibt es noch li und po (für point, linestring und polygon) zu Auswahl.</s>
 +
** <s>TTTTTTTT ist das Pattern als Zeichenkette (9 Chars, die entweder T,F,0,1,2 oder * enthalten können).</s>
 +
** <s>(+) soll ein Button sein, der bewirkt, dass ein modaler Dialog geöffnet wird, in dem man in den Bildern blättern kann (realisiert als neues Window? Schön wäre wenn der Dialog mit ESC wieder verlassen werden könnte).</s>
 +
** <s>Tests: Siehe [[PostGIS_-_Tipps_und_Tricks#ST_Relate]]</s>
 +
  SQL Composer (Help):
 +
  » Basics:                  --pick--        V
 +
  » Outputs / Measurements:  --pick--        V
 +
  » Relationships (bool):    --pick--        V
 +
  » Relate exemplified (bool) ptV ptV TTTTTTTT(+)
 +
  » Processors (geom):        --pick--         V
 +
  » Examples:                --pick--         V
  
== XAPI-to-Map ==
+
== Feature Requests ==
  
Hinweis: Diese Funktion ist in Bearbeitung. Ideen und Verbesserungsvorschläge sind sehr erwünscht, z.B. per E-Mail an [http://gis.hsr.ch/index.php?option=com_contact&task=view&contact_id=2&Itemid=119 Stefan Keller].
+
BUG:
 +
* mapextent() kann nur einmal vorkommen. Damit funktioniert's z.B. bei ST_Relate und JOINs nicht.
  
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.  
+
XAPI-Syntax-Erweiterungen:
 +
* mit Parameter sql=... ergänzen,
 +
* Ansprechen der Tabelle 'osm_poi': "poi[name=%Feuerwehr%]".
 +
* OR von tags. Bsp. ?xapi=[amenity=restaurant]|[tourism=office].
 +
* NOT Operator '!' mit values, z.B. ?xapi=[amenity=restaurant][cuisine!=pizza].
 +
* Operatoren LIKE '~~' und ILIKE '~~*', sowie NOT LIKE / NOT ILIKE ('!~~' / '!~~*') mit den für DB üblichen Wildcards '_' und '%' (PostgreSQL Style; man könnte auch nur '~', etc. nehmen).
 +
* Wildcard '*' für Values, Bsp.: alle Werte mit Namen [name=*]
  
Hier einige Beispiele (geplant):
+
Weitere:
* <nowiki>http://152.96.80.16/node[tourism=zoo]</nowiki>
+
* Interaktive Karten-Queries...''' => Siehe [[OpenPOIMap]]
* <nowiki>http://152.96.80.16/node[amenity=*][bbox=5.943,45.935,10.612,47.731]</nowiki>
+
* Permalink-Aufruf zu OSM und OpenPOIMap.  
* <nowiki>http://152.96.80.16/node[highway=busstop]</nowiki>
+
* Logging der Queries.
* <nowiki>http://152.96.80.16/node[amenity=hospital][bbox=-6,50,2,61]?zoom=18&lat=47.223&lon=8.822&layers=B0T</nowiki>
+
* Button "Show Tables" neu => "About Database" mit Statistik der enthaltenen Points, POIs, Lines und Polygons (File:about-db-query.php)
* <nowiki>http://152.96.80.16/*[seamark:type=signal_station_warning]</nowiki>
+
* 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.
 +
* Wait-Cursor (OpenLayers?)
 +
* Konfigurierbare Marker Query with Attribut 'icon', mit dem man Icons von externen Quellen (url) darstellen kann.
 +
* Ersetzen von xapi.py (Python) durch xapi.php (PHP)
  
Zu realisierende Syntaxelemente:
+
== PostGIS-Terminal Documentation ==
* 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:
+
=== XAPI-to-Map ===
* 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:
+
==== About ====
* Wegen '[', '*' sowie ':' (in Keys wie 'name:de') muss die URL kanonisiert werden?
+
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]). Ebenfalls nicht implementiert ist der Existenz-Operator, z.B. 'node[not(tag)]' wenn Nodes gesucht werden, die keine Tags enthalten (siehe [http://wiki.openstreetmap.org/wiki/Xapi#Child_Element_Predicates XAPI Child Element Predicate]).
* Spaces sind in Values auch zugelassen, vgl. node[name=Knie's Kinderzoo]
 
* das XAPI-to-Map sollte auch funktionieren mit Permalink, z.B. node[amenity=hospital][bbox=-6,50,2,61]?zoom=18&lat=47.223&lon=8.822&layers=B0T
 
  
=== XAPI-Beispiele ===
+
Notes on the "xapi=..." parameter and the weblink: 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]
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
 
* MapQuest (weltweit): http://open.mapquestapi.com/xapi/api/0.6/*%tourism=zoo%5D%5Bbbox=5.943,45.935,10.612,47.731%5D
 
* Xiala (Schweiz, ca. 2h behind OSM Planet): http://osm.xiala.net:8080/xapi/api/0.6/*%5Btourism=zoo%5D
 
* Geometa HSR (Schweiz, alt): http://geometa.hsr.ch/xapi/api/0.6/*%5Btourism=zoo%5D
 
* Defunct?
 
** http://xapi.spline.de/api/0.6/*%5Btourism=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 ===
+
==== Test Cases ====
 +
* node[amenity=*]
 +
* node[highway=busstop]
 +
* node[highway=busstop|shop|washroom]
 +
* way[highway = busstop][shop=drugstore]
 +
* node[bbox=5.943,45.935,10.612,47.731]
 +
* node[amenity=hospital][bbox=-6, 50, 2, 61]
 +
* node[name=Knie's Kinderzoo][name:de=Knie]
 +
* node[bbox=1,2,3,4]
 +
* way[amenity=*][highway=busstop]
  
* [[XAPI]]
+
Some test examples (based on template 'http://labs.geometa.info/postgisterminal/?xapi=node%5Btourism%3Dzoo%5D'):
* 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]
+
<tt>
* 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).
+
  Use template:
* Häufige Anfragen gemäss Logs:
+
  <postgisterminal_url>?xapi=node[tourism=zoo]</nowiki>
** *[amenity=*]
+
  <postgisterminal_url>/?xapi=node[amenity=*][bbox=5.943,45.935,10.612,47.731]</nowiki>
** *[highway=bus_stop]
+
  <postgisterminal_url>/?xapi=node[highway=busstop]</nowiki>
** *[shop=*]
+
  <postgisterminal_url>/?xapi=node[amenity=hospital][bbox=-6,50,2,61]?zoom=18&lat=47.223&lon=8.822&layers=B0T</nowiki>
** *[tourism=*]
+
  <postgisterminal_url>/?xapi=*[seamark:type=signal_station_warning]</nowiki>
** node[railway=station]
+
</tt>
** relation[type=restriction]
+
 
 +
==== Syntax-Abbildungen ====
 +
Supported syntax elements (Original XAPI-Dokumentation und andere XAPI-Server: Siehe [[XAPI]]):
 +
* 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]
  
=== Abbildung XAPI => SQL ===
+
Not supported syntax:
 +
* Child Element Predicates from XAPI (see above).
 +
* Limitations of the XAPI syntax:
 +
** It's not possible to do an OR query with nodes OR ways.
 +
** There exists no negation of key/value selections.
  
Tabellen-Abbildungen auf Basis osm2pgsql-Schema:
+
Abbildung XAPI-Tabellen zu [[EOSMDBOne]]-Schema:
* point, line, polygon => osm_point, osm_line, osm_polygon
+
* node, way und relation => osm_point, osm_polygon und osm_rels (wie XAPI-Syntax ausser way zu dem ways fehlt (vgl. line)).
* node => osm_node (siehe unten; nicht osm_nodes)
+
* point, line und polygon => osm_point, osm_line und osm_polygon (zusätzlich zur XAPI-Syntax).
* way => osm_way (siehe unten; nicht osm_ways)  
+
* '*' => osm_all (d.h. osm_point, osm_line und osm_polygon).
* relation => osm_rels
 
* '*' => osm_nwr ('''NEU zu erstellen!''')
 
* all => osm_all ('''Nicht erwähnt in XAPI aber sinngemäss)'''
 
  
Zusätzliche Views: 
+
Abbildung XAPI-zu-SQL ([https://github.com/osm-spline/xapi/blob/master/sql/sampleRequests.sql Sample SQL-Requests]):
  -- Materialized view => similar to osm_node!
+
* BBox search ("bbox") becomes "WHERE ST_CONTAINS(<bbox>,<point_or_way_geom>)"
  CREATE VIEW osm_way_v AS
+
* equality search ("key=value") becomes AND hstore(tags)->'key' = 'value'
    SELECT
+
* wildcard search ("key=*") becomes AND hstore(tags)?'fee'
      w.id AS id,
 
      (SELECT ST_SetSRID(ST_MakeLine(ST_Makepoint(n.lon/100.0, n.lat/100.0)),900913) AS way
 
      FROM osm_nodes n
 
      JOIN (SELECT unnest(nodes) AS id FROM osm_ways WHERE id=w.id) m ON m.id = n.id
 
      ) AS way,
 
      hstore(w.tags) AS tags
 
    FROM osm_ways w;
 
  
  CREATE VIEW osm_nwr AS
+
=== Webservices API ===
 
 
Zusätzliche Tabellen:
 
  -- *Materialized view* --
 
  CREATE VIEW osm_node_v AS
 
    SELECT
 
      id,
 
      ST_SetSRID(ST_MakePoint(lon/100.0, lat/100.0),900913) AS way,
 
      hstore(tags) AS tags
 
    FROM osm_nodes;
 
  --DROP TABLE osm_node
 
  CREATE TABLE osm_node AS SELECT * FROM osm_node_v;
 
  ALTER TABLE osm_node ADD PRIMARY KEY(id);
 
  CREATE INDEX ON osm_node USING GIST(way); -- takes very long time!?!
 
  CREATE INDEX ON osm_node USING GIST(tags);
 
  
  Todo RMI:
+
==== About DB Request ====
  * Zusätzliche Tabellen 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...
 
  * Mir das Skript mit allen Tabellen und Grants schicken
 
  
XAPI-zu-SQL-Abbildungen:
+
Last Update and List of tables.
* bbox becomes "WHERE ST_CONTAINS(<bbox>,<point_or_way_geom>)"
+
* Request: about-db-query.php
* equality search becomes AND hstore(tags)->'key' = 'value'
+
* Response: Zwei Zeilen bestehend aus Datum der letzten erfolgreichen Aktualisierung der OSM-Daten (mit Hilfe des daily jobs) und allen Tabellen in der DB 'gisdb':
* wildcard search becomes AND hstore(tags)?'fee'
+
LastUpdate=17.06.2011
 +
Tables=geography_columns,geometry_columns,osm_all,osm_line,osm_nodes,osm_point,osm_polygon,osm_rels,osm_roads,osm_ways,spatial_ref_sys
  
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).
+
==== XAPI-to-SQL ====
* daher => '''ausprobieren, ob osm2pgsql im Slim-mode auch 'version' als Attribut in den Zieltabellen speichern kann'''.
+
* Request:
* [http://wiki.openstreetmap.org/wiki/Osm2pgsql/schema osm2pgsql Schema] (default.style)
+
http://labs.geometa.info/postgisterminal/xapi.py?query=node[amenity=*]
* [http://trac.openstreetmap.org/browser/applications/utils/osmosis/trunk/package/script/pgsnapshot_schema_0.6.sql pgsnapshot_schema_0.6]
+
* Response: SQL gemäss dem gegebenen XAPI-String:
* Passend dazu SQL-Requests https://github.com/osm-spline/xapi/blob/master/sql/sampleRequests.sql
+
SELECT ST_AsText(way) geom,
 +
COALESCE(name, '')||' '||osm_id label
 +
FROM osm_point WHERE hstore(tags)?'amenity'
 +
 
 +
* Wegen URL-Spezialzeichen '[', '*' sowie ':' (in Keys wie 'name:de') muss die get URL speziell behandelt werden.
 +
* Square Brackets und 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 Abfragen 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.
  
 
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):
 
   <nowiki>.../node[tourism=zoo][bbox=6.2,46.1,10.0,47.6]</nowiki>
 
   <nowiki>.../node[tourism=zoo][bbox=6.2,46.1,10.0,47.6]</nowiki>
 
   wird abgebildet auf:  
 
   wird abgebildet auf:  
   SELECT ST_AsText(way) geom, hstore(tags)->'name'||' '||osm_id label
+
   SELECT ST_AsText(way) geom, name||' '||osm_id label
   FROM osm_node
+
   FROM osm_point
 
   WHERE tags @> hstore('tourism','zoo') -- nicht hstore(tags)->'tourism' = 'zoo'
 
   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)
 
   AND ST_Contains(ST_Transform(ST_SetSRID('BOX(6.2 46.1, 10.0 47.6)'::box2d, 4326),900913),way)
  
Zeile 146: Zeile 152:
 
   wird abgebildet auf osm_line (oder osm_polygon?)
 
   wird abgebildet auf osm_line (oder osm_polygon?)
  
== Weitere interessante Queries ==
+
=== Security Features ===
 
 
=== 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 ==
+
Siehe auch [[EOSMDBOne]].
  
=== Security Features ===
+
Client (JavaScript) fügt "LIMIT 100" dazu.
SF1. 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.
 
=> 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
 
 
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?
 
=> RMI
 
  
 
=== Data Features ===
 
=== Data Features ===
DF1. Style-Datei anpassen, so dass Tabellennamen ohne "planet" und ohne Underscores erzeugt werden, also z.B. anstelle „planet_osm_point“ nur „osmpoint“.
 
=> RMI
 
  
DF2. Neu immer Laden mit hstore (-h Parameter bei osm2pgsql). Zudem folgende Tabelle hinzufügen:
+
Data comes from [[OpenStreetMap]] and is imported once every early morning using [[Osm2pgsql]]. For more information about the database see [[EOSMDBOne|'Enhanced OpenStreetMap Database One' (EOSMDBOne)]].
  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...
 
 
 
=> RMI
 
 
 
DF3. Einrichten eines Cron-Jobs, der einmal pro Nacht die Schweiz neu einspielt (Bitte Vorschlag).
 
=> RMI
 
 
 
DF4. Siehe NF2.
 
=> 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 ==  
+
=== Logging ===
  --- 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'):
+
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?
  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'
 

Aktuelle Version vom 4. November 2012, 23:29 Uhr

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

Task List

Siehe auch Diskussion:EOSMDBOne#Task List.

  • BUG: Permalink funktioniert nicht: Erzeugt zurzeit ?xapi=*%5Bamenity%253Dbicycle_parking%5D&zoom=18&lat=47.22315&lon=8.81703&layers=B0T statt ?xapi=*[amenity%3Dbicycle_parking]&zoom=18&lat=47.22315&lon=8.81703&layers=B0T
  • BUG: ST_Relate funktioniert auf IE nicht.
  • Zusätzliche Weblinks: | Permalink | OSM | OpenPOIMap |
    • OSM: http:// www.openstreetmap.org/?zoom=18&lat=47.22315&lon=8.81703&layers=B0T
    • OpenPOIMap http:// openpoimap.ch/?zoom=17&lat=47.22577&lon=8.81572&xapi=*[amenity=bicycle_parking]
  • In Fusszeile statt "GISpunkt HSR" neu "Geometa Lab HSR" wobei der Weblink neu http://wiki.hsr.ch/StefanKeller/wiki.cgi?GeometaLab heisst.
  • Syntax-Erweiterung:
    • Zusätzlich zu 'node', 'way', 'rel' und '*' (=all) soll auch die (fast) gleichnamige Tabelle 'poi' angegeben werden können.
    • Vergleichsoperator '!=' (=IsNotEqualTo) bei Values. Bsp.: ?xapi=node[cuisine!=pizza].
    • Logischer Operator '|' (= OR) bei Tags - analog zum "union" operator für Values: Bsp.: ?xapi=node[amenity=restaurant]|[tourism=office]

History

  • ST_Relate einbauen.
  • Anzeigen Datum und neu Zeit (via about-db-query.php)
  • Signalisieren, wenn DB offline ist (via about-db-query.php)
  • Bug: Seit dem letzten Code-Update scheinen die vordefinerten Queries (vgl. "SQL Composer" auf Startseite) nicht mehr zu funktionieren. Bei den „Examples“ hat es zwei gleiche Einträge (mit unterschiedlichen SQLs) und die vordefinierte Variable für Geometrieattribut heisst linestring (statt way).
  • XAPI (Links): XAPI-to-Map-URLs sollen in Mails und Wikis eingebettet werden können (daher 'PostGIS_Terminal#XAPI-to-Map'). D.h. kanonisierte URLs sollten ebenfalls funktionieren, z.B. http://labs.geometa.info/postgisterminal/?xapi=node%5Btourism=zoo%5D<> (auch "Permalink" kanonisiert die XAPI-Syntax (<nowiki>['=']).
  • Kontext-Menu (= "Right Click") in der Karte entweder disablen oder idealerweise mit Funktionen belegen (ähnlich Google Maps) wie "Zoom in, Zoom out, Karte hier zentrieren" (sobald auf OpenPOIMap implementiert).
  • Relate exemplified:
    • Unten bedeutet “ptV ptV TTTTTTTT (+)” folgendes:
    • ptV ist ein Auswahlfeld/Pulldownliste mit pt als Default. Nebst pt gibt es noch li und po (für point, linestring und polygon) zu Auswahl.
    • TTTTTTTT ist das Pattern als Zeichenkette (9 Chars, die entweder T,F,0,1,2 oder * enthalten können).
    • (+) soll ein Button sein, der bewirkt, dass ein modaler Dialog geöffnet wird, in dem man in den Bildern blättern kann (realisiert als neues Window? Schön wäre wenn der Dialog mit ESC wieder verlassen werden könnte).
    • Tests: Siehe PostGIS_-_Tipps_und_Tricks#ST_Relate
 SQL Composer (Help):
 » Basics:                   --pick--         V
 » Outputs / Measurements:   --pick--         V
 » Relationships (bool):     --pick--         V
 » Relate exemplified (bool) ptV ptV TTTTTTTT(+)
 » Processors (geom):        --pick--         V
 » Examples:                 --pick--         V

Feature Requests

BUG:

  • mapextent() kann nur einmal vorkommen. Damit funktioniert's z.B. bei ST_Relate und JOINs nicht.

XAPI-Syntax-Erweiterungen:

  • mit Parameter sql=... ergänzen,
  • Ansprechen der Tabelle 'osm_poi': "poi[name=%Feuerwehr%]".
  • OR von tags. Bsp. ?xapi=[amenity=restaurant]|[tourism=office].
  • NOT Operator '!' mit values, z.B. ?xapi=[amenity=restaurant][cuisine!=pizza].
  • Operatoren LIKE '~~' und ILIKE '~~*', sowie NOT LIKE / NOT ILIKE ('!~~' / '!~~*') mit den für DB üblichen Wildcards '_' und '%' (PostgreSQL Style; man könnte auch nur '~', etc. nehmen).
  • Wildcard '*' für Values, Bsp.: alle Werte mit Namen [name=*]

Weitere:

  • Interaktive Karten-Queries... => Siehe OpenPOIMap
  • Permalink-Aufruf zu OSM und OpenPOIMap.
  • Logging der Queries.
  • Button "Show Tables" neu => "About Database" mit Statistik der enthaltenen Points, POIs, Lines und Polygons (File:about-db-query.php)
  • 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.
  • Wait-Cursor (OpenLayers?)
  • Konfigurierbare Marker Query with Attribut 'icon', mit dem man Icons von externen Quellen (url) darstellen kann.
  • Ersetzen von xapi.py (Python) durch xapi.php (PHP)

PostGIS-Terminal Documentation

XAPI-to-Map

About

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]). Ebenfalls nicht implementiert ist der Existenz-Operator, z.B. 'node[not(tag)]' wenn Nodes gesucht werden, die keine Tags enthalten (siehe XAPI Child Element Predicate).

Notes on the "xapi=..." parameter and the weblink: 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 [1]

Test Cases

  • node[amenity=*]
  • node[highway=busstop]
  • node[highway=busstop|shop|washroom]
  • way[highway = busstop][shop=drugstore]
  • node[bbox=5.943,45.935,10.612,47.731]
  • node[amenity=hospital][bbox=-6, 50, 2, 61]
  • node[name=Knie's Kinderzoo][name:de=Knie]
  • node[bbox=1,2,3,4]
  • way[amenity=*][highway=busstop]

Some test examples (based on template 'http://labs.geometa.info/postgisterminal/?xapi=node%5Btourism%3Dzoo%5D'):

 Use template:
 <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>

Syntax-Abbildungen

Supported syntax elements (Original XAPI-Dokumentation und andere XAPI-Server: Siehe XAPI):

  • 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]

Not supported syntax:

  • Child Element Predicates from XAPI (see above).
  • Limitations of the XAPI syntax:
    • It's not possible to do an OR query with nodes OR ways.
    • There exists no negation of key/value selections.

Abbildung XAPI-Tabellen zu EOSMDBOne-Schema:

  • node, way und relation => osm_point, osm_polygon und osm_rels (wie XAPI-Syntax ausser way zu dem ways fehlt (vgl. line)).
  • point, line und polygon => osm_point, osm_line und osm_polygon (zusätzlich zur XAPI-Syntax).
  • '*' => osm_all (d.h. osm_point, osm_line und osm_polygon).

Abbildung XAPI-zu-SQL (Sample SQL-Requests):

  • BBox search ("bbox") becomes "WHERE ST_CONTAINS(<bbox>,<point_or_way_geom>)"
  • equality search ("key=value") becomes AND hstore(tags)->'key' = 'value'
  • wildcard search ("key=*") becomes AND hstore(tags)?'fee'

Webservices API

About DB Request

Last Update and List of tables.

  • Request: about-db-query.php
  • Response: Zwei Zeilen bestehend aus Datum der letzten erfolgreichen Aktualisierung der OSM-Daten (mit Hilfe des daily jobs) und allen Tabellen in der DB 'gisdb':
LastUpdate=17.06.2011
Tables=geography_columns,geometry_columns,osm_all,osm_line,osm_nodes,osm_point,osm_polygon,osm_rels,osm_roads,osm_ways,spatial_ref_sys

XAPI-to-SQL

  • Request:
http://labs.geometa.info/postgisterminal/xapi.py?query=node[amenity=*]
  • Response: SQL gemäss dem gegebenen XAPI-String:
SELECT ST_AsText(way) geom,
COALESCE(name, )||' '||osm_id label
FROM osm_point WHERE hstore(tags)?'amenity'
  • Wegen URL-Spezialzeichen '[', '*' sowie ':' (in Keys wie 'name:de') muss die get URL speziell behandelt werden.
  • Square Brackets und 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 Abfragen siehe auch die JXAPI-Logs (live!) sowie den Log-Backup von XAPI mit unbestätigter Herkunft.

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

Siehe auch EOSMDBOne.

Client (JavaScript) fügt "LIMIT 100" dazu.

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

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

Data Features

Data comes from OpenStreetMap and is imported once every early morning using Osm2pgsql. For more information about the database see 'Enhanced OpenStreetMap Database One' (EOSMDBOne).

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?