Diskussion:PostGIS Terminal: Unterschied zwischen den Versionen
Stefan (Diskussion | Beiträge) (→Abbildung XAPI => SQL) |
Stefan (Diskussion | Beiträge) (→XAPI-to-Map) |
||
Zeile 3: | Zeile 3: | ||
== XAPI-to-Map == | == XAPI-to-Map == | ||
− | Umwandeln von OSM XAPI | + | Umwandeln von OSM [[XAPI]] Requests nach SQL. Das Ziel ist nicht die vollständige "Syntax", sondern nur spezifische und häufige Requests, bestehend aus Key/Value Pairs (0, 1 ode mehrere) sowie einer Bounding Box-Angabe. |
− | + | Hier einige Beispiele: | |
+ | * <nowiki>http://152.96.80.16/node[tourism=zoo][bbox=5.9436,45.9358,10.6127,47.7319]?zoom=18&lat=47.223&lon=8.822&layers=B0T</nowiki> | ||
+ | * <nowiki>http://152.96.80.16/node[amenity=*]</nowiki> | ||
+ | * <nowiki>http://152.96.80.16/node[highway=busstop]</nowiki> | ||
+ | * <nowiki>http://152.96.80.16/node[amenity=hospital][bbox=-6,50,2,61]</nowiki> | ||
+ | * <nowiki>http://152.96.80.16/*[seamark:type=signal_station_warning]</nowiki> | ||
Zu realisierende Syntaxelemente: | Zu realisierende Syntaxelemente: | ||
− | * | + | * alle Tabellen sowie '*' (siehe Tabellen-Abbildungen unten) |
* Equality Filter: way[highway=motorway] | * Equality Filter: way[highway=motorway] | ||
* Union/OR Filter: way[highway=motorway|motorway_link|trunk|primary] | * Union/OR Filter: way[highway=motorway|motorway_link|trunk|primary] | ||
Zeile 18: | Zeile 23: | ||
* 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). | * 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 '[' muss die URL kanonisiert werden | + | * Wegen '[', '*' sowie ':' (in Keys wie 'name:de') muss die URL kanonisiert werden? |
− | |||
* Spaces in Values sind zugelassen? | * Spaces in Values sind zugelassen? | ||
− | + | * Sollte auch funktionieren mit Permalink. | |
− | |||
− | * | ||
− | |||
=== Dokumentation === | === Dokumentation === | ||
Zeile 39: | Zeile 40: | ||
Dokumentation: | Dokumentation: | ||
* [[XAPI]] | * [[XAPI]] | ||
+ | * ANTRL-Syntax [https://github.com/iandees/xapi-antlr/blob/master/src/main/antlr3/com/yellowbkpk/geo/xapi/antlr/XAPI.g] | ||
+ | * Python-Parser? [http://gitorious.org/osm-poi-tools/server/blobs/master/list/views.py] | ||
* Logs: http://jxapi.openstreetmap.org/xapi/admin/stats und log http://fsi.spline.de/osm/xapi-access-23-01-2011.log.bz2 | * Logs: http://jxapi.openstreetmap.org/xapi/admin/stats und log http://fsi.spline.de/osm/xapi-access-23-01-2011.log.bz2 | ||
* Häufige Anfragen gemäss Logs: | * Häufige Anfragen gemäss Logs: | ||
Zeile 49: | Zeile 52: | ||
=== Tests === | === Tests === | ||
− | + | ||
− | + | ??? - Siehe Beispiele oben. | |
− | |||
− | |||
=== Abbildung XAPI => SQL === | === Abbildung XAPI => SQL === | ||
− | + | Tabellen-Abbildungen gemäss osm2pgsql-Schema: | |
* node, way, relation => osm_nodes, osm_ways, osm_rels | * node, way, relation => osm_nodes, osm_ways, osm_rels | ||
* '*' => osm_nwr ('''NEU zu erstellen analog osm_all!''') | * '*' => osm_nwr ('''NEU zu erstellen analog osm_all!''') | ||
Zeile 62: | Zeile 63: | ||
* all => osm_all | * all => osm_all | ||
− | Abbildungen: | + | XAPI-zu-SQL-Abbildungen: |
* bbox becomes "WHERE ST_CONTAINS(<bbox>,<point_or_way_geom>)" | * bbox becomes "WHERE ST_CONTAINS(<bbox>,<point_or_way_geom>)" | ||
* equality search becomes AND hstore(tags)->'key' = 'value' | * equality search becomes AND hstore(tags)->'key' = 'value' |
Version vom 10. Juni 2011, 07:13 Uhr
Please note here your questions and feedback below. You can also send them directly to Stefan Keller.
Inhaltsverzeichnis
XAPI-to-Map
Umwandeln von OSM XAPI Requests nach SQL. Das Ziel ist nicht die vollständige "Syntax", sondern nur spezifische und häufige Requests, bestehend aus Key/Value Pairs (0, 1 ode mehrere) sowie einer Bounding Box-Angabe.
Hier einige Beispiele:
- http://152.96.80.16/node[tourism=zoo][bbox=5.9436,45.9358,10.6127,47.7319]?zoom=18&lat=47.223&lon=8.822&layers=B0T
- http://152.96.80.16/node[amenity=*]
- http://152.96.80.16/node[highway=busstop]
- http://152.96.80.16/node[amenity=hospital][bbox=-6,50,2,61]
- http://152.96.80.16/*[seamark:type=signal_station_warning]
Zu realisierende Syntaxelemente:
- alle Tabellen sowie '*' (siehe Tabellen-Abbildungen unten)
- Equality Filter: way[highway=motorway]
- Union/OR Filter: way[highway=motorway|motorway_link|trunk|primary]
- Wildcard Filter: way[highway=*]
- BBox Filter: [bbox=left,bottom,right,top]
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 in Values sind zugelassen?
- Sollte auch funktionieren mit Permalink.
Dokumentation
Hier konkrete, laufende Beispiele:
- http://jxapi.openstreetmap.org/xapi/api/0.6/*%5Bname=Sylt%5D
- http://open.mapquestapi.com/xapi/api/0.6/node[operator=Stadtverkehr Lübeck]
- http://open.mapquestapi.com/xapi/api/0.6/node[ref:svhl=*]
- Defunct?
Dokumentation:
- XAPI
- ANTRL-Syntax [1]
- Python-Parser? [2]
- Logs: http://jxapi.openstreetmap.org/xapi/admin/stats und log http://fsi.spline.de/osm/xapi-access-23-01-2011.log.bz2
- Häufige Anfragen gemäss Logs:
- *[amenity=*]
- *[highway=bus_stop]
- *[shop=*]
- *[tourism=*]
- node[railway=station]
- relation[type=restriction]
Tests
??? - Siehe Beispiele oben.
Abbildung XAPI => SQL
Tabellen-Abbildungen gemäss osm2pgsql-Schema:
- node, way, relation => osm_nodes, osm_ways, osm_rels
- '*' => osm_nwr (NEU zu erstellen analog osm_all!)
- point, line, polygon => osm_point, osm_line, osm_polygon
- all => osm_all
XAPI-zu-SQL-Abbildungen:
- bbox becomes "WHERE ST_CONTAINS(<bbox>,<point_or_way_geom>)"
- equality search becomes AND hstore(tags)->'key' = 'value'
- wildcard search becomes AND hstore(tags)?'fee'
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 hozuladen (dann mit version+=1).
- daher => ausprobieren, ob osm2pgsql im Slim-mode auch 'version' als Attribut in den Zieltabellen mitberücksichtigen kann.
- pgsnapshot_schema_0.6
- Passend dazu SQL-Requests https://github.com/osm-spline/xapi/blob/master/sql/sampleRequests.sql
Beispiel:
.../api/0.6/node[tourism=zoo][bbox=6.2,46.1,10.0,47.6] wird abgebildet auf: SELECT ST_AsText(way) geom, name label FROM osm_point WHERE hstore(tags)->'tourism'='zoo' AND ST_Contains(ST_Transform(ST_SetSRID('BOX(6.2 46.1, 10.0 47.6)'::box2d, 4326),900913),way) bzw. auf (mit GiST-Index?): SELECT ST_AsText(way) geom, name label FROM osm_point WHERE tags @> hstore('tourism','zoo') AND ST_Contains(ST_Transform(ST_SetSRID('BOX(6.2 46.1, 10.0 47.6)'::box2d, 4326),900913),way)
Weitere interessante Queries
Alle Tags 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: [3]
Feature Requests
Security Features
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 [4]
SET STATEMENT_TIMEOUT TO 60000; SET transaction_read_only TO TRUE; 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
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:
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
- Permalink: Ergänzung Uebergabe Query als URL (siehe XAPI)
- 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'