On Thu, Oct 29, 2009 at 10:36:21AM +0100, Satz Klauer wrote:
> Hi,
> 
> eigentlich dachte ich, dass ich was ganz einfaches machen will, aber
> mit den Beschreibungen der vorhandenen APIs und Kartendaten komme ich
> nicht wirklich weiter.
> 
> Ich habe als Ausgangsdaten GPS-Koordinaten und möchte nun ermitteln,
> wo sich diese Koordinaten befinden. Allerdings will ich die Position
> nicht in einer Grafik dargestellt haben, sondern ich benötige eine
> Textausgabe mit Ort und nächstgelegener Straße.
> 
> Also z.B: GPS-Koordinaten 48,8372 13,8237, zurückgelieferte
> Information "München, Marienplatz" (keine ahnung, ob die Koordinaten
> wirklich zum Marienplatz passen ;-)
> 
> Hat jemand ein paar Heiße Tipps, wie sich sowas realisieren lässt?

Via osmosis einen datenbankabzug in die Postgres schieben und dann:

select  w.id as wayid,
        wt1.v as streettype,
        wt2.v as name,
        round(ST_Distance(pos.pos, w.linestring)/360*(6376500.0*3.14159*2.0)) 
as distance
from    ways w, way_tags wt1, way_tags wt2,
        (select ST_SetSRID(ST_Makepoint(8.1, 51.0), 4326) as pos) pos
where   ST_DWithin(w.linestring, pos.pos, 1200.0/(6376500.0*3.14159*2.0)*360.0)
and     w.id = wt1.way_id
and     wt1.k = 'highway'
and     w.id = wt2.way_id
and     wt2.k = 'name'
order by distance asc
limit 10

Die 8.1/51.0 sind die position und die 1200 ist die distance die gesucht wird.
Es gibt maximal 10 straßen sortiert nach distanz:

  wayid   | streettype  |         name         | distance 
----------+-------------+----------------------+----------
 25971613 | secondary   | Rothenberger Straße  |      103
 31993563 | residential | Hilchenbacher Straße |      319
 31993546 | residential | In der Himbeerwiese  |      403
 31993560 | residential | Hilchenbacher Straße |      501
 32192257 | residential | Carl-Kraemer-Weg     |      562
 32192251 | residential | Am Backes            |      674
 28191121 | residential | Schützenstraße       |      706
 35862375 | residential | An der Sang          |      766
 28191126 | residential | Im Langen Feld       |      827
 28191127 | residential | Im Unteren Marktfeld |      872
(10 rows)

Time: 43.420 ms

Das mit der geografischen zuordnung zu einem "Place" oder "City" wird schon
schwieriger - Eine eindeutige zuordnung geht nur ueber die boundary relations 
alles
andere ist "professionelles raten"

Mit ein bischen vorbereiten der boundary relations als geometrien in einer
datenbank geht das dann auch so:

select  cb.id, cb.adminlevel, cb.name
from    completeborders cb,
        (select ST_SetSRID(ST_Makepoint(8.1, 51.0), 4326) as pos) pos
where   ST_Within(pos.pos, cb.border)
order by adminlevel desc;

   id   | adminlevel |        name         
--------+------------+---------------------
 163253 |          8 | Hilchenbach
  62761 |          4 | Nordrhein-Westfalen
(2 rows)

Time: 38.139 ms

Das generieren der vordefinierten polygone aus den boundary relations habe ich 
schonmal
hier geschrieben:

http://lists.openstreetmap.org/pipermail/talk-de/2009-October/056253.html

Das ganze oben ist natuerlich zu einfach - Es ist nicht garantiert das die
naechstliegende Straße noch in Hilchenbach ist .. D.h. eigentlich muesste man 
erst das polygon suchen und dann die Straße suchen und zu distance noch pruefen
ob die Straße auch durch das Polygon laeuft ... Aber das sind details die
im ersten wurf mal zu vernachlaessigen sind ...

Flo
-- 
Florian Lohoff                                         f...@rfc822.org
"Es ist ein grobes Missverständnis und eine Fehlwahrnehmung, dem Staat
im Internet Zensur- und Überwachungsabsichten zu unterstellen."
- - Bundesminister Dr. Wolfgang Schäuble -- 10. Juli in Berlin 

Attachment: signature.asc
Description: Digital signature

_______________________________________________
Talk-de mailing list
Talk-de@openstreetmap.org
http://lists.openstreetmap.org/listinfo/talk-de

Antwort per Email an