- unless response.match(/couldn't find this zip/)
- data = response.split(/\s*,\s+/) # lat,long,town,state,zip
- @results.push({:lat => data[0], :lon => data[1],
- :zoom => POSTCODE_ZOOM,
- :prefix => "#{data[2]}, #{data[3]},",
- :name => data[4]})
+ results.elements.each("place") do |place|
+ lat = place.attributes["lat"]
+ lon = place.attributes["lon"]
+ klass = place.attributes["class"]
+ type = place.attributes["type"]
+ name = place.attributes["display_name"]
+ min_lat, max_lat, min_lon, max_lon = place.attributes["boundingbox"].split(",")
+ prefix_name = if type.empty?
+ ""
+ else
+ t "geocoder.search_osm_nominatim.prefix.#{klass}.#{type}", :default => type.tr("_", " ").capitalize
+ end
+ if klass == "boundary" && type == "administrative"
+ rank = (place.attributes["address_rank"].to_i + 1) / 2
+ prefix_name = t "geocoder.search_osm_nominatim.admin_levels.level#{rank}", :default => prefix_name
+ place.elements["extratags"].elements.each("tag") do |extratag|
+ prefix_name = t "geocoder.search_osm_nominatim.prefix.place.#{extratag.attributes['value']}", :default => prefix_name if extratag.attributes["key"] == "linked_place" || extratag.attributes["key"] == "place"
+ end
+ end
+ prefix = t ".prefix_format", :name => prefix_name
+ object_type = place.attributes["osm_type"]
+ object_id = place.attributes["osm_id"]
+
+ @results.push(:lat => lat, :lon => lon,
+ :min_lat => min_lat, :max_lat => max_lat,
+ :min_lon => min_lon, :max_lon => max_lon,
+ :prefix => prefix, :name => name,
+ :type => object_type, :id => object_id)