2010-06-14 18 views
0

Je développe un catalogue web immobilier et je veux géocoder chaque annonce en utilisant geokit gem. Ma question est quelle serait la meilleure disposition de base de données du point de performance si je veux effectuer une recherche par pays, ville du pays sélectionné, zone administrative ou station de métro la plus proche de la ville sélectionnée. Les pays, villes, zones administratives et stations de métro disponibles doivent être définis par l'administrateur du catalogue et doivent être validés par géocodage.Mise en page de base de données pour une application avec des fonctions de géocodage utilisant geokit

je suis venu avec une seule table:

create_table "geo_locations", :force => true do |t| 
    t.integer "geo_location_id"      #parent geo location (ex. country is parent geo location of city 
    t.string "country",    :null => false #necessary for any geo location 
    t.string "city",        #not null for city geo location and it's children 
    t.string "administrative_area"     #not null for administrative_area geo location and it's children 
    t.string "thoroughfare_name"     #not null for metro station or street name geo location and it's children 
    t.string "premise_number"      #house number 
    t.float "lng",     :null => false 
    t.float "lat",     :null => false 
    t.float "bound_sw_lat",  :null => false 
    t.float "bound_sw_lng",  :null => false 
    t.float "bound_ne_lat",  :null => false 
    t.float "bound_ne_lng",  :null => false 
    t.integer "mappable_id" 
    t.string "mappable_type" 
    t.string "type"        #country, city, administrative area, metro station or address 
    end 

géo localisation finale est l'adresse qu'il contient toutes les informations neccessary pour mettre le marqueur de l'annonce immobilière sur la carte. Mais je suis toujours coincé sur la fonctionnalité de recherche.

Toute aide serait grandement appréciée. .

Répondre

1

Vous pouvez jeter un oeil à Thinking Sphinx, il supporte la recherche géo-construit Voilà comment je le fais:

class Company < ActiveRecord::Base 
    define_index do 
     indexes :name, :sortable => true 
     has 'RADIANS(lat)', :as => :latitude, :type => :float 
     has 'RADIANS(lng)', :as => :longitude, :type => :float 
    end 
end
# Searching for companies, sort by closest first 
Company.search "bananas", :geo => [lat, lng], :order => "@geodist ASC, @relevance DESC"