From 373a3b05776bfbfaed1087089289583bc9543798 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 9 Apr 2008 23:43:38 +0000 Subject: [PATCH] Provide extra context for namefinder results where the nearest place is small (a hamlet, village or suburb). Closes #794. --- app/controllers/geocoder_controller.rb | 37 +++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/app/controllers/geocoder_controller.rb b/app/controllers/geocoder_controller.rb index a4c264a93..66962c7f6 100644 --- a/app/controllers/geocoder_controller.rb +++ b/app/controllers/geocoder_controller.rb @@ -129,20 +129,51 @@ private type = named.attributes["info"].to_s.capitalize name = named.attributes["name"].to_s description = named.elements["description"].to_s + if name.empty? prefix = "" name = type else prefix = "#{type} " end + if place distance = format_distance(place.attributes["approxdistance"].to_i) direction = format_direction(place.attributes["direction"].to_i) - placename = place.attributes["name"].to_s + placename = format_name(place.attributes["name"].to_s) suffix = ", #{distance} #{direction} of #{placename}" + + if place.attributes["rank"].to_i <= 30 + parent = nil + parentrank = 0 + parentdistance = 0 + + place.elements.each("nearestplaces/named") do |nearest| + nearestrank = nearest.attributes["rank"].to_i + nearestdistance = nearest.attributes["distance"].to_f + + if nearestrank > parentrank or + ( nearestrank == parentrank and nearestdistance < parentdistance ) + parent = nearest + parentrank = nearestrank + parentdistance = nearestdistance + end + end + + if parent + parentname = format_name(parent.attributes["name"].to_s) + + if place.attributes["info"].to_s == "suburb" + suffix = "#{suffix}, #{parentname}" + else + suffix = "#{suffix} (near #{parentname})" + end + end + end else suffix = "" end + results.push({:lat => lat, :lon => lon, :zoom => zoom, :prefix => prefix, :name => name, :suffix => suffix, :description => description}) @@ -245,6 +276,10 @@ private return "west" end + def format_name(name) + return name.gsub(/( *\[[^\]]*\])*$/, "") + end + def count_results(results) count = 0 -- 2.39.5