Diskussion:PostGIS Terminal
Please note here your questions and feedback below. You can also send them directly to Stefan Keller.
Inhaltsverzeichnis
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
- 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]
-
ST_Relate einbauen.
History
-
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 und SQL:
- NOT in die XAPI-Query einbauen?
- Parameter "&sql=" mit '_map' (System Variable) mit SQL Query über die Tabellen osm_point, osm_line, osm_polygon, osm_all oder osm_poi :
- Select by OSM tags all the primary highways and show them on a map: "&sql=SELECT _map FROM osm_point WHERE (tags @> 'highway=>primary')"
- Select by OSM tags all the primary highways without maxspeed tag: "&sql=SELECT _map FROM osm_point WHERE (tags @> 'highway=>primary') AND NOT (tags ? 'maxspeed')"
Interaktive Karten-Queries... => Siehe OpenPOIMap
- mit gid-Attribut (1): Mit 'Mouse Over' wird der Wer vom Attribut label angezeigt.
- mit gid-Attribut (2): Mit 'Mouse Click' auf eine Geometrie wird ein Weblink angezeigt, d.h. OpenLayers-Objekte klickbar machen mit Link zu OSM, z.B. http://www.openstreetmap.org/browse/way/82142220
Weitere:
- Logging.
- 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)
More Queries...
Complex SQL Queries
Select names of all OSM-objects containing 'zoo' at start middle or end (using wildcard '%' in String):
SELECT ST_AsText(way) geom, COALESCE(name, ' ')||' '||osm_id label FROM osm_all WHERE hstore(tags)->'name' ILIKE '%zoo%'
Select all parking lots for disabled persons (Rollstuhlparkplatz / wheel parking) within visible map area (without FIXME). Note: Tag capacity:disabled currently occurs always together with amenity={parking, parking_space, parking_entrance}):
SELECT ST_AsText(way) geom, COALESCE(name,' ')||' ('||COALESCE(SUBSTRING((tags->'capacity:disabled') FROM E'[0-9]+'),' ')||')' label FROM osm_poi WHERE (tags @> '"capacity:disabled"=>"yes"' OR SUBSTRING((tags->'capacity:disabled') FROM E'[0-9]+')::int > 0) AND ST_Contains(mapextent(), way)
Select all motorways (higways) with speed limit greater or equal than 100:
SELECT ST_AsText(way) geom FROM osm_line WHERE tags @> '"highway"=>"motorway"' AND COALESCE(SUBSTRING((tags->'maxspeed') FROM E'[0-9]+')::int,0) >= 100 -- 1806!
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'
Statistics: All tupels in all tables
SELECT '1. '||to_char(count(*), '999G999G999')||' osm_point(s)' FROM osm_point UNION SELECT '2. '||to_char(count(*), '999G999G999')||' osm_poi(s)' FROM osm_poi UNION SELECT '3. '||to_char(count(*), '999G999G999')||' osm_line(s)' FROM osm_line UNION SELECT '4. '||to_char(count(*), '999G999G999')||' osm_polygon(s)' FROM osm_polygon UNION SELECT '5. '||to_char(count(*), '999G999G999')||' osm_nodes' FROM osm_nodes UNION SELECT '6. '||to_char(count(*), '999G999G999')||' osm_ways' FROM osm_ways UNION SELECT '7. '||to_char(count(*), '999G999G999')||' osm_rels' FROM osm_rels ORDER BY 1
Statistics: 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: -- -- Alternative with separate tag-value: -- SELECT tmp.key as tag, tmp.value as value, count(*)::integer as freq 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
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?