2012-05-20 13 views
12

Ich versuche mit dem Google Places-API die beiden nächstgelegenen Straßen zu finden, um die nächstgelegene Kreuzung anzuzeigen. Jedes Ergebnis wird jedoch immer nur eine "Route" zurückgeben, wenn überhaupt.Eine Kreuzung mit der Google Places/Geocodierungs-API erhalten

Ich denke, ich könnte 5 Abfragen in einem + oder X-Muster tun, aber das ist Hacky, unzuverlässig, und natürlich wird die Abfrage Grenze viel früher treffen.

Ich bin versucht zu sagen, dass dies ein bewusster Zug ist, weil die API nicht für so etwas wie Navigationssysteme gedacht ist (was ich nicht versuche), aber ich hoffe immer noch, dass es einen TOS-konformen Weg gibt um die Kreuzung zu bekommen.

Seitennotiz - es scheint, als ob "types = route" keine Ergebnisse liefert, was meinen Verdacht noch verstärkt, dass Places eigentlich nur für tatsächliche POIs gedacht ist, nicht für die Navigation, obwohl die terms of service nicht erwähnt werden irgendwelche expliziten Einschränkungen in dieser Hinsicht.

BEARBEITEN: Wie Chris darauf hingewiesen hat, gibt es die Geocoding-API, die speziell für Geocoding entwickelt wurde, aber ich sehe immer noch keine Möglichkeit, die nächste Querstraße zu erhalten, außer durch mehrere Abfragen.

+0

Der umgekehrte Geocoder gibt immer genau ein Ergebnis zurück: das nächste, was es gefunden hat, also können Sie nicht tun, was Sie beschreiben. Was genau willst du erreichen? – smirkingman

+0

Ich versuche die nächste Kreuzung zu dem Punkt zu finden, wo ich bin. Zumindest möchte ich zwei Straßennamen, wenn ich an einer Kreuzung bin, aber im Idealfall möchte ich auch die nächste Querstraße. Meine Hoffnung war, dass mir die Bereitstellung einer bestimmten Radiengröße mehrere "Routen" -Ergebnisse liefern würde, und ich könnte die zweitbeste "Route" als die Querstraße verwenden. – EboMike

+0

Beim Testen kann ich bestätigen, dass ein umgekehrter Geocode nie mehr als ein Ergebnis zurückgibt: das nächste, was GoogleMap meint. Ich habe auch google.maps.places.PlaceSearchRequest ausprobiert, aber selbst wenn Sie nach "street_address" fragen, gibt es nichts zurück (es sei denn, es gibt einen Ort von Interesse, den jemand in der Nähe markiert hat). – smirkingman

Antwort

5

Der Konsens ist, dass Google Reverse-Geocoder nicht ausgereift genug ist, um Kreuzungen in einer Abfrage zu melden. Das heißt, es gibt keinen Parameter, mit dem Sie ihnen sagen können, dass Sie nur die Ergebnisse mit "types" : [ "intersection" ] möchten. Google isst hier sein eigenes Hundefutter; Wenn Sie in einem maps.google-Suchfeld ein lat/lon eingeben, erhalten Sie immer eine Straße (im Google-Sprachgebrauch, eine "Route") zurück.

Wie Sie darauf hinweisen, gibt es viele Heuristiken, die Sie anwenden könnten, um den begehrten ["intersection"] Typ zu erhalten.

z.B. Mehrere "große" Kreuzungen in Städten der 1. Welt weisen Transitstopps auf, die die Kreuzung beschreiben. Wenn irgendwelche Ergebnisse ein "types" : [ "bus_station", "transit_station" ] Element haben, können Sie versuchen, das "long_name" Element als einen Suchbegriff und hoffe, Sie erhalten eine Kreuzung.Grinsender erwähnte auch eine praktikable Lösung. Beide haben leider mehr als 2 Anfragen benötigt.

Zusammenfassend gibt es keine latelngToIntersection (lat, lng) Art der Funktion in der Google Geocoding API. Der Nachweis dafür liegt auf der Google maps.google-Seite von Google. Ich würde dein Problem anders angehen. Wenn Sie die nächstgelegene Hauptkreuzung mit einem GPS-Standort versehen möchten, kann es hilfreich sein, den Benutzer zur Hilfe zu bringen. Geocoding ist notorisch mit der ekligen Menschheit übersät.

+0

Hey Rooke, das ist eigentlich ein interessanter Ansatz. Ich könnte sogar versuchen, ein Wahrzeichen als Referenz zu verwenden (vorzugsweise eine Bushaltestelle, wie "Schmuckstraße in der Nähe von Dork Station", aber möglicherweise sogar "Food Street in der Nähe von Applebee", wenn nichts anderes auftaucht. Das erfordert weniger Abfragen als ein X-Muster Ich würde immer noch den Namen der Kreuzung bevorzugen, aber lass uns praktisch sein. Und hier ist die Bounty! – EboMike

2

Sie haben Recht, die Places API ist nicht für die Geocodierung gedacht. Politische Ergebnisse wie Straßen und Städte sind auf nur 2 Ergebnisse beschränkt, da sie nur dazu dienen, die Gebietsidentität für die zurückgegebenen Orte anzugeben.

etc. Wenn Sie nach Straßen suchen möchten versuchen, die Geocoding-API: https://developers.google.com/maps/documentation/geocoding/

+0

Danke Chris! Ich bin ein kompletter Schmink - wie habe ich die Geocoding API nicht bemerkt? Allerdings habe ich immer noch das gleiche Problem mit der Geocoding-API - ich kann nur eine umgekehrte Geocodierung eines bestimmten Punktes durchführen, der die nächstgelegene Straße zurückgibt, aber niemals eine Kreuzung. Wie finde ich die nächste Querstraße? – EboMike

1

Google Maps API dies nicht unterstützt. Es ist nur ein Adress-Geocoder. Das Beste, was Sie mit der Google Maps-API tun können, ist, dass Nutzer ihren Routenplanerdienst finden, um herauszufinden, wo der erste Zug ist, aber das ist ein totaler Hack. Vielleicht möchten Sie versuchen, andere Karten-Services zu betrachten, die diese Möglichkeit bieten.

1

Wie bereits erwähnt, gibt es keine GoogleMap-Funktion, um den Geocode umzukehren und eine Reihe von nahen Punkten zu erhalten.

Die einzige Alternative, die ich sehe, ist

  • berechnen 200 Meter N/S/E/W des Punktes mit Haversine. Sie werden ‚200‘ empirisch
  • Reverse geocode dieser 4 Punkte
  • Von den zurückgegebenen Adressen wählen müssen, nehmen Sie die 2 nächsten Straßen, die unterschiedlich sind (möglicherweise nicht erfolgreich)

Wenn Sie dies tun clientseitig werden Ihre Benutzer selten das tägliche Limit von 2'500 erreichen.

+0

Seufz, ich bin mir nicht sicher, wem ich das Kopfgeld geben soll - ich werde wahrscheinlich sowohl Ihr als auch Rookes Herangehensweise versuchen. Rooke inspirierte mich jedoch, etwas anderes zu versuchen, d. H. Eine Straße nach ihrem Namen und einem wichtigen Wahrzeichen zu identifizieren. Wäre schön, eine Prämie teilen zu können. – EboMike

3

Sie können Daten von OpenStreetMap verwenden. Ihre .osm Datei bietet die lat/lang von sich kreuzenden Straßen.

  1. So erhalten Sie die Daten.

    1. zu OpenStreetMap gehen und Ihr Platz finden, wo Sie interessiert sind, zoomen Sie in wie das 4. Häkchen.

    2. Klicken Sie in der oberen Navigationsleiste auf Exportieren, klicken Sie in der Dropdown-Liste auf "OpenStreetMap XML Data" und dann auf "Exportieren".

    3. Für eine Vielzahl von Daten wie ein Bundesland oder Land, Planet.osm und finden Sie einen gewünschten "Extrakt".

  2. die Kreuzungen zu erhalten, wollen Sie Daten suchen, die dieses Format übereinstimmt, wahrscheinlich für die Autobahn suchen.

Beispiel:

<way id="6419265" user="eric22" uid="160949" visible="true" version="2" changeset="10632563" timestamp="2012-02-09T10:49:21Z"> 
    <nd ref="53167978"/> 
    <nd ref="53163978"/> 
    <nd ref="53163979"/> 
    <nd ref="53173508"/> 
    <nd ref="53164158"/> 
    <nd ref="53173510"/> 
    <tag <b>k="highway"</b> v="residential"/> 
    <tag k="name" v="Alberta St"/> 
    <tag k="tiger:cfcc" v="A41"/> 
    <tag k="tiger:county" v="St. Louis-City, MO"/> 
    ... 
</way> 

Die way.id ist die Straße ID, ein die nd Refs sind Straßen-IDs können Sie in der gleichen Datei finden sollten. Sie sehen in etwa so aus:

‹node id="53167978" lat="38.5852785" lon="-90.2450074" user="eric22" uid="160949" visible="true" version="3" changeset="10632563" timestamp="2012-02-09T10:48:49Z"/> 
+0

Nice-Datenbank. Gibt es eine API, wo ich mit einfachen Abfragen auf die Datenbank zugreifen kann? Natürlich will ich planet.osm nicht herunterladen , und dies ist eine automatisierte Hintergrundoperation, ich kann die Webschnittstelle nicht benutzen Ich überprüfte die Web site, aber fand nicht sofort etwas – EboMike

+0

das Wiki lesen, können Sie an die DB anschließen Die Vereinigten Staaten planet.osm ist nur 25 Gigs Ich würde speichern, was immer ein Teil der Karte, die Sie brauchen, anstatt ihre DB oder Website jedes Mal, da es ein kostenloser Service ist. – NJordan

8

GeoNames bietet eine Geocoding-API für die nächstgelegene Kreuzung aus Längen-/Breitenkoordinaten.

http://www.geonames.org/maps/us-reverse-geocoder.html#findNearestIntersection

Die JSON Antwort sieht wie folgt aus:

{"intersection": 
{"adminName2":"San Mateo", 
    "street2":"Curtis St", 
    "postalcode":"94025", 
    "street1":"Roble Ave", 
    "adminCode1":"CA", 
    "distance":"0.08", 
    "countryCode":"US", 
    "lng":"-122.180842", 
    "placename":"Menlo Park", 
    "lat":"37.450649", 
    "adminName1":"California" 
}, 
"credits":"1.0" 
} 

street1 und street2 die Querstraßen sind.