Adressen in Deutschland mit GeoKIT decodieren?

Hallo,
hat jemand von euch schon einmal mit GeoKit erfolgreich deutsche Adresse
decodieren können? Ich bekomme immer die Fehlermeldung:
“You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]”

Mit Adressen aus den USA funktioniert das ohne Probleme. Ich benutze zur
Abfrage das Format ‘Street, City, Country’. Ist jenes das richtige
Format?

Hi, wenn du GoogleMaps als Provider benutzt, solltest genau die selben
Ergebnisse bekommen, wie wenn du den Text bei maps.google.com eintippst.

Grüße, Alex

Hi Alex,
habe ich auch gedacht. Ich weiss auch absolut nicht woran das liegen
kann.

Beispiel:
def lookup_geocodes
# your list of places. In a real app, this would come from the
database,
# and have more robust descriptions
places = [
{:address=>‘Königswall 32429 Minden,
Germany’,:description=>‘Home’},
]

# this loop will do the geo lookup for each place
places.each_with_index do |place,index|
  # get the geocode by calling our own get_geocode(address) method
  geocode = get_geocode place[:address]

  # geo_code is now a hash with keys :latitude and :longitude
  # place these values back into our "database" (array of hashes)
  place[:latitude]=geocode[:latitude]
  place[:longitude]=geocode[:longitude]

end

Wenn ich die Beschreibung von maps.google.com übernehme bekomme ich
folgende Meldung:
wrong fault-structure: {“faultCode”=>“Client”,
“faultString”=>“Application failed during request deserialization: \nnot
well-formed (invalid token) at line 1, column 97, byte 97 at
/usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/XML/Parser.pm
line 187\n”}

Wenn ich den Umlaut gegen oe austausche bekomme ich folgende Meldung:
You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]

Der Fehler mit dem invalid token kann ich mir nicht erklären. Bei den
Beispieladresse aus US geht es ohne Probleme, also sollte der
Google-Zugriff funktionieren.

Kann es noch andere Gründe haben?

komisch, bei mir funktioniert das:

Loading development environment (Rails 2.0.2)

places = [
?> {:address=>‘Königswall 32429 Minden,
Germany’,:description=>‘Home’},
?> ]
=> [{:description=>“Home”, :address=>“Königswall 32429 Minden,
\nGermany”}]

places.size
=> 1

place=places[0]
=> {:description=>“Home”, :address=>“Königswall 32429 Minden,
\nGermany”}

GeoKit::Geocoders::MultiGeocoder.geocode places[0][:address]
=> #<GeoKit::GeoLoc:0x4112ed78 @success=true, @provider=“google”,
@lng=8.910287, @precision=“zip+4”, @city=“Minden”, @country_code=“DE”,
@lat=52.288629, @street_address=“Königswall”,
@full_address=“Königswall, 32423 Minden, Germany”, @zip=“32423”,
@state=“Nordrhein-Westfalen”>

sogar den Zeilenumbruch ‘\n’ schluckt GeoKit.

Vielleicht ist das Problem in der get_geocode methode. Wie sieht die
aus?

-Alex

Hallo Gruppe,
auch ich hab eine Frage zum Geocoding.

Und zwar bekomme ich in der Applikation irgendwie Geo-Koordinaten, die
ich dann in einen Namen umgerechnet haben möchte. Wenn man so etwas bei
GoogleMaps eingibt, ergibt das zwar den richtigen Punkt auf der Erde,
aber bekommt keinen Namen( Stadt, Gegend, …) dazu. zB:

GeoKit::Geocoders::MultiGeocoder.geocode “52.288629, 8.910287”
=> #<GeoKit::GeoLoc:0x410ba144 @success=true, @provider=“google”,
@lng=8.910287, @precision=“country”, @city=nil, @country_code=“DE”,
@lat=52.288629, @street_address=nil, @full_address=“Germany”, @zip=nil,
@state=nil>

‘Germany’ ist mir etwas zu weit gefasst…

Kennt jemand einen Dienst im Internet der das bietet?

Grüße, Alex

Hi,
hab leider nicht mehr viel Zeit, aber ich denke mal wir haben hier ein
XMLRPC zu geocoder.us/GeoKit mit GoogleMaps Missverständniss.

Also mein Geocoding sieht so aus:

g = GeoKit::Geocoders::MultiGeocoder.geocode “Königswall 32429 Minden,
Germany”

das ist alles und du bekommst ein GeoLoc Object zurück:
#<GeoKit::GeoLoc:0x4112ed78 @success=true, @provider=“google”,
@lng=8.910287, @precision=“zip+4”, @city=“Minden”, @country_code=“DE”,
@lat=52.288629, @street_address=“Königswall”,
@full_address=“Königswall, 32423 Minden, Germany”, @zip=“32423”,
@state=“Nordrhein-Westfalen”>

und schon hast du deine Daten:

g.lat
=> 52.288629
g.lng
=> 8.910287
g.full_address
=> “Königswall, 32423 Minden, Germany”

Achja, ./script/console ist dein bester Freund. Erst damit deine Idee
testen und dann die Applikation schreiben :wink:

-Alex

Hi Alex,
die lautet:

def get_geocode(address)
logger.debug 'starting geocoder call for address: '+address
# this is where we call the geocoding web service
server =
XMLRPC::Client.new2(‘http://rpc.geocoder.us/service/xmlrpc’)
result = server.call2(‘geocode’, address)
logger.debug "Geocode call: "+result.inspect

return {:success=> true, :latitude=> result[1][0]['lat'],
:longitude=> result[1][0]['long']}

end

Ich hatte dazu von Matthias von die Antwort bekommen:

Wenn Du das per XMLRPC machen willst, brauchst Du GeoKit nicht.
Ansonsten probier mal:
include GeoKit::Geocoders
location = GoogleGeocoder.geocode(address)
mfg
Matthias

Wobei mich das wundert, da das so im GeoKit Beispiel angegeben ist (oder
anders, ich habe keine Wirkliche Ahnung, wie warum ich XMLRPC nutzen
sollte oder etwas anderes - bin hier noch in der Einarbeitung :frowning: ).

Das Beispiel von Matthias habe ich eben ausprobiert, allerdings hänge
ich hier.

include GeoKit::Geocoders habe ich in die class sandbox eingefügt
(oben).
Nur ich weiss nicht, wie ich die Location location =
GoogleGeocoder.geocode(address) anwende (also was ich bei meinem
ersetzen müßte).

Wie decodierst du den bei dir (wenn es kein Betriebsgeheimnis ist)?

Alex P. wrote:

Hi,
hab leider nicht mehr viel Zeit, aber ich denke mal wir haben hier ein
XMLRPC zu geocoder.us/GeoKit mit GoogleMaps Missverständniss.

Also mein Geocoding sieht so aus:

g = GeoKit::Geocoders::MultiGeocoder.geocode “Königswall 32429 Minden,
Germany”

das ist alles und du bekommst ein GeoLoc Object zurück:
#<GeoKit::GeoLoc:0x4112ed78 @success=true, @provider=“google”,
@lng=8.910287, @precision=“zip+4”, @city=“Minden”, @country_code=“DE”,
@lat=52.288629, @street_address=“Königswall”,
@full_address=“Königswall, 32423 Minden, Germany”, @zip=“32423”,
@state=“Nordrhein-Westfalen”>

und schon hast du deine Daten:

g.lat
=> 52.288629
g.lng
=> 8.910287
g.full_address
=> “Königswall, 32423 Minden, Germany”

Achja, ./script/console ist dein bester Freund. Erst damit deine Idee
testen und dann die Applikation schreiben :wink:

-Alex

Danke Alex,
habe diesen Weg jetzt verstanden. Die Abfrage funktioniert nun wunderbar
:-), wie ich in der Konsole sehen kann. Dort habe konnte ich auch sehen,
dass das Geocoding die Adresse nicht finden konnte.
Er schickt die Daten an Google und Geocoder, bekommt von beiden aber die
Meldung, dass die Adresse nicht gefunden wurde (hatte die Adresse zum
testen ausgetauscht):

Google geocoding. Address: Graf-Adolf-Platz, Düsseldorf, Germany.
Result: <?xml version="1.0" encoding="UTF-8"?>Graf-Adolf-Platz,
Düsseldorf,
Germany610geocode
Google was unable to geocode address: Graf-Adolf-Platz, Düsseldorf,
Germany

Geocoder.us geocoding. Address: Graf-Adolf-Platz, Düsseldorf, Germany.
Result: 2: couldn’t find this address! sorry
geocoder.us was unable to geocode address: Graf-Adolf-Platz, Düsseldorf,
Germany

Woran kann das liegen? Bei Google konnte ich sehen, dass der Code 610
für einen falschen API-Key stehen kann? Der Key sollte allerdings in
Ordnung sein (ist eine lokale Verwendung möglich?).

Die Fehlermeldung kommt auch bei der anderen Adresse :wink: (hatte das eben
noch einmal kurz getestet).
Wo testest du den? Kannst du lokal testen?

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

  • -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

is es bei der google api nicht so, dass man den host angeben muss,
den man für den key benutzt?
localhost geht dann vielleicht nicht…

gruß manuel

Am 27.02.2008 um 02:35 schrieb Knut L.:

Die Fehlermeldung kommt auch bei der anderen Adresse :wink: (hatte das
eben
noch einmal kurz getestet).
Wo testest du den? Kannst du lokal testen?

Posted via http://www.ruby-forum.com/.


rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

  • -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.7 (Darwin)

iD8DBQFHzZ1Is/WwCK0ZZEARAnUhAKCz+mKeP1/krLqZoO/m500E7DTShQCgrDnE
RT+S3GGxTAynK3fyk1CYLiM=
=/FRP

  • -----END PGP SIGNATURE-----
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.7 (Darwin)

iD8DBQFHzZ3Gs/WwCK0ZZEARAmTyAJoCi6fNWhyE625n1/xKz+mvxu2JEgCgiT0n
BMc0pGcc97XMDPUwrvWyyVA=
=blHp
-----END PGP SIGNATURE-----

Ja, kannst du !
Du musst dir aber für jede IP Adresse, in diesem Fall die 127.0.0.1
einen eigenen API Key erstellen.

Mario

Hi Manuel,
an so etwas hatte ich auch schon gedacht. Nur leider konnte ich das noch
nicht verifizieren… weiss jemand, ob man auch auf dem localhost
GoogleMaps nutzen kann?

Manuel W. wrote:

is es bei der google api nicht so, dass man den host angeben muss,
den man f�r den key benutzt?
localhost geht dann vielleicht nicht…

Rails Camper wrote:

Ja, kannst du !
Du musst dir aber für jede IP Adresse, in diesem Fall die 127.0.0.1
einen eigenen API Key erstellen.

Mario

Hi Mario,
danke!!! War mir nicht bewußt, dass das auf IP Basis läuft (also
127.0.0.1). Ich werde das gleich ausprobieren. Danke!!!

Am 04.03.2008 um 20:59 schrieb Knut L.:

danke!!! War mir nicht bewußt, dass das auf IP Basis läuft (also
127.0.0.1).

Tut es auch nicht. Es läuft eigentlich auf Basis des Hostnames. Wobei
man natürlich auch einen Key für 127.0.0.1 generieren kann.
Entscheidend ist aber der Hostname, der in der Addresszeile des
Browsers steht. Soll heißen: wenn Du unter einer IP mehrere Domains
betreibst, musst Du auch mehrere Keys generieren.

Gruß
Matthias_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Hi Matthias,
leider macht da Google nicht mit. 127.0.0.1 ist für ein Api Key nicht
valided (leider habe ich das Geoprojekt nicht hier), aber localhost
schon :slight_smile: - ich hoffe das funktioniert (sollte lt. deiner Def. nun
gehen).
Danke nochmals!

Tut es auch nicht. Es l�uft eigentlich auf Basis des Hostnames. Wobei
man nat�rlich auch einen Key f�r 127.0.0.1 generieren kann.
Entscheidend ist aber der Hostname, der in der Addresszeile des
Browsers steht. Soll hei�en: wenn Du unter einer IP mehrere Domains
betreibst, musst Du auch mehrere Keys generieren.

Gru�
Matthias_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Also die Fehlermeldung mit der nicht vorhandenen, der neue Key scheint
zu funktionieren. Allerdings werden nun keine Werte mehr ausgelesen,
bzw. angezeigt:
der Controller ist nun auf das nötigste Beschränkt und liefert 1 Adresse
gefunden zurück:
class SandboxController < ActionController::Base
include GeoKit::Geocoders

def lookup_geocodes
# your list of places. In a real app, this would come from the
database,
# and have more robust descriptions
places = [
{:address=>‘Königswall 32429 Minden, Germany’,:description=>‘Home’},
]

# this loop will do the geo lookup for each place
places.each_with_index do |place,index|
  # get the geocode by calling our own get_geocode(address) method
geocode = get_geocode place[:address]

  # geo_code is now a hash with keys :latitude and :longitude
  # place these values back into our "database" (array of hashes)
 place[:latitude]=geocode[:latitude]
 place[:longitude]=geocode[:longitude]

end

#place the result in the session so we can use it for display
session[:places] = places

#let the user know the lookup went ok
render :text=> 'Es wurden '+places.length.to_s+' Adressen gesucht'

end

def show_google_map
# all we’re going to do is loop through the @places array on the
page
@places=session[:places]
end

private
def get_geocode(address)
g = GeoKit::Geocoders::MultiGeocoder.geocode(address)
return {:success=> true, :latitude=> g.lat, :longitude=> g.lng}

end
end

View:

Google maps example Here's the map:

Ok, habe den Fehler gefunden. An einer Stelle hatte ich die Key
vergessen…