Maxspeed, Fortsetzung

Ich habe mal eine Sendung gesehen in der ein System besprochen wurde das in Fussgaengerzonen per Videoueberwachung automatisch nach “terroristischem Verhalten” suchen sollte. Als nachgefragt wurde was “terroristisches Verhalten” in einer Fussgaengerzone sei, kam die Antwort, das wenn man schneller oder langsamer als der Durchsnitt laefut sei das schon sehr verdaechtig…

Also anstelle eines Ordnungsgeld bei zu schnell gehen berappen zu muessen, wird man gleich nach Guantanamo geschickt… :wink:

Ich finde das auch sinnvoller, dass man die Eigenschaften, die die Straße an sich hat, in eine Relation packt, die die Straßenabschnitte enthält. Und Eigenschaften, die die Straßenabschnitte haben, kommen an die Ways. Ob das Standard ist oder nicht, weiß ich nicht. Und wenn es das nicht ist, gibt es bestimmt genug Leute, die sagen, dass Relationen zu kompliziert sind…

Zum eigentlichen Thema: Wäre es nicht besser, die Ortseingangsschilder zu taggen? Und zwar so, dass man unterscheiden kann, was “innen” und was “außen” ist. Das hat den Vorteil, dass man gut überprüfen kann, ob irgendwo eine Inkonsistenz ist (wenn ein Ort “ausläuft”). Dann müsste man z.B. in meinem Heimatdorf nur 4 Ortseingangsschilder setzen, anstatt ca. 30 ways zu taggen.

Ortseingangsschilder werden auch getaggt. Aber sie helfen nicht 100%. Es gibt ja Straßen, die innerorts sind, aber ausserhalb eines um alle Ortseingangsschilder gespannten Polygons liegen würden. Andersrum genauso

Ich würde das auch anders definieren. Eine Straße ist im Ort, wenn ich von ihr ausgehend auf anderen Straßen (also nicht auf track oder ähnlichem) zu der “Innenseite” eines Ortsausgangsschildes komme. Wenn ich an der “Außenseite” ankomme, dann ist sie außerorts. Wenn ich eine “Innenseite” und (von einem anderem Schild) die “Außenseite” erreiche, dann sind die Daten inkonsistent.

residential … im Ortsgebiet
unclassified … Freilandstraße

Was ist daran so schwierig?

Es gibt genügend Fälle, wo real keine Ortstafeln stehen, sei es weil darauf vergessen wurde, oder an Tracks und Radwegen. Selbst wenn du in solchen Fällen willkürlich Phantom-Ortstafeln mappst, werden größere Städte immer inkonsistent sein.

Bei einem vergessenen Ortseinganzschild klappt das nicht mehr. Ich würde bei OSM nie davon ausgehen, dass die Daten vollständig sind. Und bei größeren Orten wird das eine ziemlicher Rechenaufwand.

Es gibt sowohl unclassified innerorts als auch residential ausserorts. Unclassified ist im Wiki auch als Straße innerorts erwähnt. Bei residential ausserorts kann man sich vielleicht drüber streiten. Soll aber nicht das Thema sein.

wenn ich jetzt die erlaubten Geschwindigkeiten unterschiedlich darstellen will, kann ich ja die Maxspeeds in Nummern umwandeln und filtern


maxspeedfb=# select highway, maxspeed from osm_line where to_number(maxspeed,'9999D99')>0 and to_number(maxspeed,'9999D99')<30 limit 1;
 highway | maxspeed
---------+----------
 service | 5
(1 Zeile)

Jetzt stehen da aber nicht nur Zahlen drin, sondern auch “none”, “signals” und wer weiß was noch und da bricht mir Postgres ab.


maxspeedfb=# select highway, maxspeed from osm_line where to_number(maxspeed,'9999D99')>0 and to_number(maxspeed,'9999D99')<30 limit 10;
FEHLER:  ungültige Eingabesyntax für Typ numeric: » «

Wie kann ich die Query um sowas erweitern wie " select highway, maxspeed from osm_line where to_number(maxspeed,‘9999D99’)>0 and to_number(maxspeed,‘9999D99’)<30 AND wenn to_number(maxspeed,‘9999D99’) keine Fehler produziert"
?

to_number mag kein ’ ’ oder null.
versuch mal to_number(coalesce(maxspeed,‘0’),‘9999D99’)

gruss
walter

ob 0 als Ersatz für null bei dir sinnvoll ist, musst du checken. ich bin dafür zu faul hungrig.

Danke Walter.


....AND textregexeq(maxspeed,'^[[:digit:]]+(\.[[:digit:]]+)?$')

scheint auch zu gehen, aber Deine Lösung verstehe ich wenigstens :wink:

hier ist jetzt ganz Europa drin
http://suncobalt.dyndns.org:82/maxspeed.php

Wenn ich Zeit finde, mache ich sie auch noch bunt (Geschwindigkeitsabhängig)

Thomas, was ich dich schon immer mal fragen wollte: Welchen Sinn hat egtl. der Punkt in der Bildschirmmitte? Ist mir schon bei anderen Karten von dir aufgefallen.

Schau mal links unten auf der Karte, wo die Position steht…das ist der Punkt dazu.

Ich bin für 1. Ist leichter zum Auswerten und wenn die Geschwindigkeit tatsächlich reduziert wird, dann lässt es sich recht leicht filtern: source:maxspee=:urban und maxspeed>40.

PS: Ich bin kein Grüner und würde trotzdem 80 überland bevorzugen, denn auch wenn die Autos deutlich stabiler werden, für 100 frontal sind sie nicht gebaut! (Und 30er-Zone abseits der Landesstraße befürworte ich auch). So und jetzt lyncht mich :stuck_out_tongue:

hab vor einigen Minuten per Zufall die Stelle gefunden, wo man ihn abstellen kann: im Layerswitcher. Der hat mich schon immer genervt :wink:

Lynchen ist verboten. Wie wär’s denn damit? - aber gaaaaaaaanz langsam: http://archief.flabber.nl/archief/020715.php

Puh, mich kräuselt sich noch alles. Toller Trick.

Naja. Und wie willst du das machen, wenn du maxspeed=50 setzen willst? Da musst du auch ein “virtuelles Ortseingangsschild” setzen.

Du musst einmal über jeden Weg. Das ist nicht teuer.

Tracks und Radwege würde ich bei der “Innerortssuche” nicht erlauben. Zu Phantom-Ortstafeln: siehe oben.

so, jetzt ist es bunt. Die Erklärung der Farben gibts rechts oben unter “Info”

Banause…ich sollte den wohl mal ausm Layerswitcher nehmem :wink:

Maxspeed Map für Mapserver&Postgres Besitzer
…oder ich bastel mir ein Overlay…


wget http://download.geofabrik.de/osm/europe.osm.pbf

osmosis --read-pbf europe.osm.pbf --tf accept-ways maxspeed=* maxspeed:forward=* maxspeed:backward=* --tf reject-relations --used-node --write-xml maxspeed.osm

sudo su postgres

createdb -E utf8 maxspeed
cat /usr/share/postgresql/9.0/contrib/postgis-1.5/postgis.sql | psql -d maxspeed
cat /usr/share/postgresql/9.0/contrib/postgis-1.5/spatial_ref_sys.sql | psql -d maxspeed

osm2pgsql -l -d maxspeed -p osm -s -S /usr/share/osm2pgsql/maxspeed.style -C 11000 maxspeed.osm 

/usr/share/osm2pgsql/maxspeed.style ist


# OsmType  Tag          DataType     Flags
way        highway      text         linear
way        maxspeed     text         linear
way        maxspeed:forward text     linear
way        maxspeed:backward text    linear
node,way   z_order      int4         linear # This is calculated during import
way        way_area     real                # This is calculated during import


sudo su postgres
psql -d maxspeed

update osm_line set maxspeed = "maxspeed:forward" where "maxspeed:forward" is not null and maxspeed is null;
update osm_line set maxspeed = "maxspeed:backward" where "maxspeed:backward" is not null and maxspeed is null;
ALTER TABLE osm_line DROP COLUMN "maxspeed:forward";
ALTER TABLE osm_line DROP COLUMN "maxspeed:backward";
grant SELECT on osm_line to "www-data";
create index osm_line_highway_idx on osm_line(highway);
ALTER TABLE osm_line ADD COLUMN "speedclasss"
UPDATE osm_line set speedclass = '1' where to_number(maxspeed,'9999D99')>0 and to_number(maxspeed,'9999D99')<31 and textregexeq(maxspeed,'^[[:digit:]]+(\.[[:digit:]]+)?$')
UPDATE osm_line set speedclass = '2' where to_number(maxspeed,'9999D99')>30 and to_number(maxspeed,'9999D99')<61 and textregexeq(maxspeed,'^[[:digit:]]+(\.[[:digit:]]+)?$')
UPDATE osm_line set speedclass = '3' where to_number(maxspeed,'9999D99')>60 and to_number(maxspeed,'9999D99')<91 and textregexeq(maxspeed,'^[[:digit:]]+(\.[[:digit:]]+)?$')
UPDATE osm_line set speedclass = '4' where to_number(maxspeed,'9999D99')>90 and to_number(maxspeed,'9999D99')<121 and textregexeq(maxspeed,'^[[:digit:]]+(\.[[:digit:]]+)?$')
UPDATE osm_line set speedclass = '5' where (to_number(maxspeed,'9999D99')>120 and textregexeq(maxspeed,'^[[:digit:]]+(\.[[:digit:]]+)?$')) OR NOT textregexeq(maxspeed,'^[[:digit:]]+(\.[[:digit:]]+)?$')

danach legen wir die Rendering Regeln an, am besten da, wo die normale Mapfile ist, also bspw eine Datei maxspeed.map


LAYER
    STATUS ON 
    GROUP "maxspeed" 
    PROJECTION 
	"init=epsg:4326" 
    END 
    CONNECTIONTYPE postgis 
    CONNECTION "host=localhost dbname=maxspeed user=www-data password=www-data port=5432"
    PROCESSING "CLOSE_CONNECTION=DEFER" 
    maxscaledenom 54180
    minscaledenom 0
    TYPE LINE
    NAME "maxspeedclosebunt"
    DATA "way from (select way, osm_id ,highway,speedclass from osm_line where (highway in ('motorway','motorway_link','trunk','trunk_link','primary','primary_link','secondary','secondary_link','tertiary','unclassified','residential') and maxspeed is not null) order by z_order) as foo using unique osm_id using srid=4326"
    CLASSITEM "speedclass"
    CLASS
        EXPRESSION "1"
        STYLE
            WIDTH 3
            COLOR 0 255 0
        END      
    END
    CLASS
        EXPRESSION "2"
        STYLE
            WIDTH 3
            COLOR 255 240 0
        END      
    END
    CLASS
        EXPRESSION "3"
        STYLE
            WIDTH 3
            COLOR 255 136 0
        END      
    END
    CLASS
        EXPRESSION "4"
        STYLE
            WIDTH 3
            COLOR 255 0 0
        END      
    END
    CLASS
        EXPRESSION "5"
        STYLE
            WIDTH 3
            COLOR 0 0 0
        END      
    END
END

LAYER
    STATUS ON 
    GROUP "maxspeed" 
    PROJECTION 
	"init=epsg:4326" 
    END 
    CONNECTIONTYPE postgis 
    CONNECTION "host=localhost dbname=maxspeed user=www-data password=www-data port=5432"
    PROCESSING "CLOSE_CONNECTION=DEFER" 
    maxscaledenom 1743443
    minscaledenom 54180
    TYPE LINE
    NAME "maxspeedfarbunt"
    DATA "way from (select way, osm_id ,highway,speedclass from osm_line where (highway in ('motorway','trunk','primary') and maxspeed is not null) order by z_order) as foo using unique osm_id using srid=4326"
    CLASSITEM "speedclass"
    CLASS
        EXPRESSION "1"
        STYLE
            WIDTH 3
            COLOR 0 255 0
        END      
    END
    CLASS
        EXPRESSION "2"
        STYLE
            WIDTH 3
            COLOR 255 255 0
        END      
    END
    CLASS
        EXPRESSION "3"
        STYLE
            WIDTH 3
            COLOR 255 136 0
        END      
    END
    CLASS
        EXPRESSION "4"
        STYLE
            WIDTH 3
            COLOR 255 0 0
        END      
    END
    CLASS
        EXPRESSION "5"
        STYLE
            WIDTH 3
            COLOR 0 0 0
        END      
    END
END

LAYER
    STATUS ON
    GROUP "maxspeed"
    PROJECTION
        "init=epsg:4326"
    END
    CONNECTIONTYPE postgis
    CONNECTION "host=localhost dbname=maxspeed user=www-data password=www-data port=5432"
    PROCESSING "CLOSE_CONNECTION=DEFER"
    minscaledenom 1743443
    maxscaledenom 13867550
    TYPE LINE
    NAME "maxspeedwmbunt"
    DATA "way from (select way, osm_id ,highway,speedclass from osm_line where highway='motorway' and maxspeed is not null order by z_order) as foo using unique osm_id using srid=4326"
    CLASSITEM "speedclass"
    CLASS
        EXPRESSION "1"
        STYLE
            WIDTH 3
            COLOR 0 255 0
        END      
    END
    CLASS
        EXPRESSION "2"
        STYLE
            WIDTH 3
            COLOR 255 255 0
        END      
    END
    CLASS
        EXPRESSION "3"
        STYLE
            WIDTH 3
            COLOR 255 136 0
        END      
    END
    CLASS
        EXPRESSION "4"
        STYLE
            WIDTH 3
            COLOR 255 0 0
        END      
    END
    CLASS
        EXPRESSION "5"
        STYLE
            WIDTH 3
            COLOR 0 0 0
        END      
    END
END

Sodele, und zuletzt gehen wir in unsere “normale” Mapfile und binden die neue Datei ein. Bei mir sieht das so aus…ganz unten vorm letzten END
INCLUDE ‘/osm/mapserver/maxspeed.map’

Fertig. Jetzt kann man in OL das WMS Layer einbinden. Man kann sowohl die ganze Gruppe (maxspeed hier), also aich die einzelnen Layer einbinden. Bspw so


        wms maxspeed = new OpenLayers.Layer.WMS("Maxspeed Layer","http://mein.server.de/wms?", {
                          layers: 'maxspeed', transparent: true,
                          projection:new OpenLayers.Projection("EPSG:900913"),
                          format: 'aggpng24'
                          },
                          {isBaseLayer: false}
        );