Format Längen&Breitengrad

Hallo zusammen,

nachdem ich nun mit eurer hilfe meinen PostgreSQL server mit Postgis super ans laufen gebracht habe, stehe ich nun wieder vor einem weiteren problem:
ich habe nun im daten bestand herausgefunden das das koordinatensystem von postgis folgendem format entspricht:

6580705.17,743657.81

nun möchte ich aber gerne wissen an welcher stelle dieser punkte im normalen
längen und breitengrad format liegt. also z.B. 50.80563, 6.78365

wie kann ich das nun umrechnen? bzw. was ist das für ein format welches von postgis/osm/mapnik verwendet wird?

Vielen dank schon für jeden tip.

viele grüße
patrick

ok ich habe nun herausgefunden das das wohl sogenannte mercator angaben sind.
ich habe da nun auch was bei wikipedia gefunden.
nun noch eine frage, kann es sein dass, das dieses mittelalterliche format ist, als die menschheit davon ausgegangen ist das mekka das zentrum der welt ist?
also die koordinate 0000000.00,0000000.00 die kaaba in mekka ist?

liebe grüße
patrick

Was Du das hast, sind aller Wahrscheinlichkeit nach Angaben in der “sphärischen Mercator-Projektion”. Der Punkt 0,0 bei dieser Projektion liegt genau da, wo auch der Greenwich-Meridian und der Aequator aufeinandertreffen.

Das Umrechnen von einer Projektion in eine andere Projektion ist nicht trivial; man darf sich das nicht so vorstellen wie von Celsius nach Fahrenheit oder sowas, da ist ein Haufen Trigonometrie mit dabei.

Zum Glueck nimmt die PostGIS Dir das ab, wenn Du die Funktion ST_Transform einsetzt und als Koordinatensystem dabei den Code 4326 (das steht fuer das, was Du den “normalen Laengen- und Breitengrad” nennst) angibst.

Wenn Du im Augenblick irgendwo z.B. ein

select astext(way) from tabelle where …

hast, schreibst Du nun

select astext(st_transform(way, 4326)) from tabelle where …

Falls dies Dein Haupt-Anwendungsfall ist und Du gar nicht vorhast, Kacheln aus der Datenbank zu rendern, ist es besser, Du gibst bei osm2pgsql gleich ein “-l” (minus ell) an, dann werden alle Koordinaten gleich in dieser Form abgespeichert.

Bye
Frederik

Hi,

Gerhard Mercator hat von 1512 bis 1594 gelebt, und das ist also nicht mehr Mittelalter, sondern Neuzeit :wink:

Wo findest Du im Artikel http://de.wikipedia.org/wiki/Mercator-Projektion etwas über Mekka?

Ciao,
Frank

Hallo,
dass es einen Herrn Mercator gab war mir unbekannt :wink:
Ich konnte mich nur daran erinnern das es in der Zeit vor Christus (also auch nicht Mittelalter :smiley: ) eine Berechnungsmethode der X Y Koordinaten gab, wo die kaaba in mekka der bezugspunkt war, nun habe ich gedacht das die Mercator-Projetion evtl. daraus abgeleitet ist :wink: dem ist also nicht so, man lernt eben nie aus.

Mittlerweile habe ich auch schon etwas mathematisches gefunden, das mich auf den richtigen weg gebracht hätte, aber die PostGIS Funktion ST_Transform ist mir dann doch lieber :slight_smile:

Vielen Dank an dieser Stelle.

Liebe Grüße
Patrick

Ich mein der hieß auch eigentlich Krämer und seinen Namen latinisiert weil mand das damals cool fand. Wenn mann statt osm2pgsql lieber gleich osmosis verwendet hat man auch gleich normale Koordinaten in WGS84 dabei.
Anleitung dazu auch hier: http://wiki.openstreetmap.org/wiki/User:Tiototo

Hi,

das bringt mir leider nicht viel, da ich den Datenbestand auch zum rendern von Kacheln verwende.
Macht es eventuell Sinn, eine 2te Datenbank zu verwenden, die für die gazetteer-anwendung optimiert ist,
http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/gazetteer/README.txt
so dass ich diese Datenbank dann für die Volltextsuche verwenden kann und diese mir dann die koordinaten für den Mapserver zurückliefert?

Viele Grüße
Patrick

osm2pgsql kann beides importieren (Gibt da die Parameter “-l” für LatLon, “-m” für Mercator, Mercator ist der defaultwert).

Kann denn Dein Renderer mit ner Datenbank mit Längengrad/Breitengrad umgehen? Vielleicht kannst Du leichter den Umstellen als den Gazetteer.
2 Datenbanken gehen natürlich auch, aber ist doppelter Platzverbrauch, doppelte Arbeit beim Updaten…

Hi, also mit long und lat habe ich das soweit nun alles im griff, die funktion st_transform reich mir vollkommen.
mein nächstes problem ist nun wenn ich in der suche (nominatim.openstreetmap.org) zum beispiel die tankstelle morgenstern in erftstadt suche, wird dies mir mit allen daten aufgelistet:
starße: Bahnhofstare
hausnummer: 48
postcode: 50374
is_in: rhein-erft-kreis, regierungsbezirk köln, nordrhein-westfalen.

diese daten sind auch alle schön in der germany.osm im xml format hinterlegt.

aber leider finde ich genau diese daten; addr:postcode, addr:street usw. nicht in der datenbank lediglich addr:housenumber ist in der entsprechenden tabelle als spalte angelegt.

für jeden tip bin ich sehr dankbar.

liebe grüße
patrick

Hast Du eine Spalte “tags”? Die wird angelegt, wenn osm2pgsql mit “–hstore” oder “-k” läuft…

Da findest du alles, was für osm2pgsql nicht ins übliche Schema passt. Und dort landen dann auch “addr:postcode”-Felder. Eine Ausgabe sähe dann z.B. so aus:

 select osm_id,tags->'addr:street' as strasse,tags->'addr:postcode' as postleitzahl from osm_point where "addr:housenumber"='1' limit 5;
  osm_id   |   strasse    | postleitzahl 
-----------+--------------+--------------
 330054520 | Hauptstraße  | 83131
 700829296 |              | 
 700783337 |              | 
 255870784 | Fabrikstraße | 83101
 702097393 |              | 
(5 rows)

Und abfragen so:

select distinct tags->'addr:street' as strasse from osm_point where (tags->'addr:postcode'='85276') limit 5;
      strasse      
-------------------
 Adlerskron
 Adolf-Rebl-Straße
 Ahornring
 Am Hagberg
 Am Hügel
(5 rows)

Zur Vereinfachung habe ich mir ein paar views gebastelt, die mir die komische Art, ein hstore anzusprechen, abnehmen. Die musste ich aber auch aus anderen Gründen anlegen, vielleicht brauchst Du die nicht.

Grüße, Max

Hallo Max,

Super, das hat mir sehr weiter geholfen.
Natürlich habe ich die Daten nicht mit der -k Option importiert, deswegen fehlen bei mir auch die Daten.
Na dann nochmal 8Std import :slight_smile:

So abschließend habe ich noch eine Frage, wenn mir die jemand beantworten kann, bin ich restlos glücklich und ich höre auf zu nerven hehe
Ich gehe nun mal wieder von meiner Region aus:

Dirmerzheim (ortsteil von erftstadt):
Coverage: Point
OSM: node 284756591
Dirmerzheim (Type: place:suburb, node 284756591, 15, , Polygon, 0 GOTO)

Ich möchte nun in der Datenbank nach amenity=‘pub’ oder amenity=‘restaurant’ für diesen suburb suchen, wie habe ich nun die möglichkeit dies zu bewerkstelligen, da der suburb Dirmerzheim nur
mit einem Point und nicht mit einem Polygon markiert ist.

bei einem polygon könnte ich nun einfach:


SELECT AsText("way") AS geom1,AsBinary("way") AS geom2,*
FROM planet_osm_point 
WHERE "way" && 'POLYGON((743448.12 6581458.64,743632.65 6581510.93,743928.99 6581597.11,744517.21 6581765.51,744851.2 6581854.87,744773.66))' limit 1000;  #koordinaten gekürtzt da über 300punkte

absetzen, dann weiß ich was alles inerhalb eines Polygon ist, aber wie geht dass wenn ein Ort nicht als Polygon hinterlegt ist??

Liebe Grüße
Patrick

Mir fällt da nur die Entfernungssuche ein. Geht aber halt oft in die Hose, weil Gemeinden nicht kreisförmig sind…

Alle Restaurants im Umkreis von 500 Metern um den Node 22281426:

select osm_id,name from osm_point where amenity='restaurant' and distance((select way from osm_point where osm_id=22281426),way) <500;
   osm_id   |          name          
------------+------------------------
  440673818 | Station Karwendelblick
  440683734 | da Mamma Lucia
 1102296676 | Amalfi Da Francesco
  440683942 | Dubrovnik
  684507857 | Platzl
 1094868694 | Zur Kutsche
  684507872 | Gasthof Stern

Die nächsten 5 Gemeinden um den “Gasthof Stern”:

select osm_id,name,place,distance((select way from osm_point where osm_id=684507872),way) as entfernung from osm_point where  place in ('town','city','hamlet')  order by entfernung limit 5;
  osm_id   |     name     | place  |    entfernung    
-----------+--------------+--------+------------------
  22281426 | Mittenwald   | town   | 442.255007126766
 295561265 | Aschaualm    | hamlet | 5677.14077266822
 868310644 | Unterkirchen | hamlet | 7119.16013808037
 366475858 | Kranzbach    | hamlet | 7271.41171456213
 868308776 | Lochlehn     | hamlet | 9988.93895602725

Alles nicht wirklich schön… In besser gemappten Gegenden könntest Du noch den nächsten Node mit “addr:city” suchen, ist sicher oft besser als der Gemeinde-Node, in diesem Beispiel aber nicht, der nächste liegt 12km weit weg.

Grüße, Max

PS: Das da oben ist alles unoptimierter Code, ich weiss nicht, wie viele Restaurants da gesucht werden und wie oft die Entfernung berechnet wird. Eventuell wär noch eine vorangestellte Abfrage mit bounding box gut, damit nicht sämtliche Kneipen der Welt durchgerechnet werden um dann die im 500m-Radius auszugeben. Ich habs mal damit probiert, aber bei meiner winzigen Gegend gabs keinen Unterschied, könnte bei einer Deutschlandkarte anders sein…