匹配 zip 与地理编码在 rails4 中获取太多数据
Matching zip with geocode fetch too many data in rails4
您好,我已将其包含在我的 gemfile 中:
gem 'geokit'
gem 'geokit-rails'
并在我的模型中编写了这段代码
class Contact < ActiveRecord::Base
validate :zip_and_city_match
def zip_and_city_match
p "aaaaaaaaaaaaaa"
geo = Geokit::Geocoders::MultiGeocoder.geocode(self.zip)
p 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
p geo
p 'city'
p geo.city
p "sssssssssssssssssssssss"
end
end
所以当我给 contact_attributes"=>{"current_address1"=>"test1dinsh", "current_address2"=>"awwwwwwwww", "country"=>"IN", "city"=>"Indore", "zip"=>"452001"}
然后它给了我这种类型的输出:
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
#<Geokit::GeoLoc:0xbec3078 @all=[#<Geokit::GeoLoc:0xbec3078 ...>, #<Geokit::GeoLoc:0xbec83e8 @all=[#<Geokit::GeoLoc:0xbec83e8 ...>], @street_address=nil, @sub_premise=nil, @street_number=nil, @street_name=nil, @city=nil, @state=nil, @state_code="Republic of Bashkortostan", @state_name="Republic of Bashkortostan", @zip="452001", @country_code="RU", @province="Republic of Bashkortostan", @success=true, @precision="city", @full_address="Republic of Bashkortostan, Russia, 452001", @lat=54.1245735, @lng=54.1369126, @provider="google", @district="Belebeyevsky District", @country="Russia", @accuracy=4, @suggested_bounds=#<Geokit::Bounds:0xbec30f0 @sw=#<Geokit::LatLng:0xbec312c @lat=54.098381, @lng=54.110801>, @ne=#<Geokit::LatLng:0xbec31f4 @lat=54.1550891, @lng=54.158854>>>, #<Geokit::GeoLoc:0xbec92fc @all=[#<Geokit::GeoLoc:0xbec92fc ...>], @street_address=nil, @sub_premise=nil, @street_number=nil, @street_name=nil, @city="Indore", @state=nil, @state_code="MP", @state_name="Madhya Pradesh", @zip="452001", @country_code="IN", @province="MP", @success=true, @precision="city", @full_address="Indore, Madhya Pradesh 452001, India", @lat=22.7081955, @lng=75.8824422, @provider="google", @district="Indore", @country="India", @accuracy=4, @suggested_bounds=#<Geokit::Bounds:0xbec8438 @sw=#<Geokit::LatLng:0xbec844c @lat=22.6845079, @lng=75.8606602>, @ne=#<Geokit::LatLng:0xbec84ec @lat=22.7359325, @lng=75.91539259999999>>>], @street_address="Mičurinova", @sub_premise=nil, @street_number=nil, @street_name="Mičurinova", @city="Subotica", @state=nil, @state_code="Vojvodina", @state_name="Vojvodina", @zip="452001", @country_code="RS", @province="Vojvodina", @success=true, @precision="street", @full_address="Mičurinova, Subotica 452001, Serbia", @lat=46.0988609, @lng=19.6422459, @provider="google", @district="Severnobački okrug", @country="Serbia", @accuracy=7, @suggested_bounds=#<Geokit::Bounds:0xbec1bc4 @sw=#<Geokit::LatLng:0xbec1bec @lat=46.0973894197085, @lng=19.6407217697085>, @ne=#<Geokit::LatLng:0xbec1c3c @lat=46.1000873802915, @lng=19.6434197302915>>, @neighborhood="Novo Selo">
'city'
"Subotica"
"sssssssssssssssssssssss"
请指导我为什么要给这个城市我将如何获取正确的城市,即我给了印多尔然后它必须与它匹配。提前致谢
试试这个,它给了我正确的城市和州。
require 'geokit'
geo = GeoKit::Geocoders::MultiGeocoder.geocode('Indore, 452001')
#or
geo = GeoKit::Geocoders::MultiGeocoder.geocode('India, 452001')
if geo.success
geo.state # => MP
geo.city # => Indore
end
您不应该只尝试使用邮政编码,您可以尝试使用国家和邮政编码,因为在其他国家也可以找到相同的邮政编码。它可能 return 多个或错误。
请参阅 geokit gem 自述文件的 multiple results 部分。正如它所说,对于不明确的查询,您可以获得不止一个结果。当您通过单个 zipcode
:
请求结果时,就会发生这种情况
geo = Geokit::Geocoders::MultiGeocoder.geocode('452001')
geo.all.map{|i| i.full_address}
# => ["Mičurinova, Subotica 452001, Serbia", "Republic of Bashkortostan, Russia, 452001", "Indore, Madhya Pradesh 452001, India"]
如您所见,在三个不同的位置发现了相同的 zipcode
。您可以 select 手动选择您需要的那个:
geo.all.find{|i| i.country == 'India'}
或者您可以向地理编码服务提供更多信息(如果可能):
def zip_and_city_match
zip_and_country = self.zip + " " + self.country
geo = Geokit::Geocoders::MultiGeocoder.geocode(zip_and_country)
# => should return only one result
end
您好,我已将其包含在我的 gemfile 中:
gem 'geokit'
gem 'geokit-rails'
并在我的模型中编写了这段代码
class Contact < ActiveRecord::Base
validate :zip_and_city_match
def zip_and_city_match
p "aaaaaaaaaaaaaa"
geo = Geokit::Geocoders::MultiGeocoder.geocode(self.zip)
p 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
p geo
p 'city'
p geo.city
p "sssssssssssssssssssssss"
end
end
所以当我给 contact_attributes"=>{"current_address1"=>"test1dinsh", "current_address2"=>"awwwwwwwww", "country"=>"IN", "city"=>"Indore", "zip"=>"452001"}
然后它给了我这种类型的输出:
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
#<Geokit::GeoLoc:0xbec3078 @all=[#<Geokit::GeoLoc:0xbec3078 ...>, #<Geokit::GeoLoc:0xbec83e8 @all=[#<Geokit::GeoLoc:0xbec83e8 ...>], @street_address=nil, @sub_premise=nil, @street_number=nil, @street_name=nil, @city=nil, @state=nil, @state_code="Republic of Bashkortostan", @state_name="Republic of Bashkortostan", @zip="452001", @country_code="RU", @province="Republic of Bashkortostan", @success=true, @precision="city", @full_address="Republic of Bashkortostan, Russia, 452001", @lat=54.1245735, @lng=54.1369126, @provider="google", @district="Belebeyevsky District", @country="Russia", @accuracy=4, @suggested_bounds=#<Geokit::Bounds:0xbec30f0 @sw=#<Geokit::LatLng:0xbec312c @lat=54.098381, @lng=54.110801>, @ne=#<Geokit::LatLng:0xbec31f4 @lat=54.1550891, @lng=54.158854>>>, #<Geokit::GeoLoc:0xbec92fc @all=[#<Geokit::GeoLoc:0xbec92fc ...>], @street_address=nil, @sub_premise=nil, @street_number=nil, @street_name=nil, @city="Indore", @state=nil, @state_code="MP", @state_name="Madhya Pradesh", @zip="452001", @country_code="IN", @province="MP", @success=true, @precision="city", @full_address="Indore, Madhya Pradesh 452001, India", @lat=22.7081955, @lng=75.8824422, @provider="google", @district="Indore", @country="India", @accuracy=4, @suggested_bounds=#<Geokit::Bounds:0xbec8438 @sw=#<Geokit::LatLng:0xbec844c @lat=22.6845079, @lng=75.8606602>, @ne=#<Geokit::LatLng:0xbec84ec @lat=22.7359325, @lng=75.91539259999999>>>], @street_address="Mičurinova", @sub_premise=nil, @street_number=nil, @street_name="Mičurinova", @city="Subotica", @state=nil, @state_code="Vojvodina", @state_name="Vojvodina", @zip="452001", @country_code="RS", @province="Vojvodina", @success=true, @precision="street", @full_address="Mičurinova, Subotica 452001, Serbia", @lat=46.0988609, @lng=19.6422459, @provider="google", @district="Severnobački okrug", @country="Serbia", @accuracy=7, @suggested_bounds=#<Geokit::Bounds:0xbec1bc4 @sw=#<Geokit::LatLng:0xbec1bec @lat=46.0973894197085, @lng=19.6407217697085>, @ne=#<Geokit::LatLng:0xbec1c3c @lat=46.1000873802915, @lng=19.6434197302915>>, @neighborhood="Novo Selo">
'city'
"Subotica"
"sssssssssssssssssssssss"
请指导我为什么要给这个城市我将如何获取正确的城市,即我给了印多尔然后它必须与它匹配。提前致谢
试试这个,它给了我正确的城市和州。
require 'geokit'
geo = GeoKit::Geocoders::MultiGeocoder.geocode('Indore, 452001')
#or
geo = GeoKit::Geocoders::MultiGeocoder.geocode('India, 452001')
if geo.success
geo.state # => MP
geo.city # => Indore
end
您不应该只尝试使用邮政编码,您可以尝试使用国家和邮政编码,因为在其他国家也可以找到相同的邮政编码。它可能 return 多个或错误。
请参阅 geokit gem 自述文件的 multiple results 部分。正如它所说,对于不明确的查询,您可以获得不止一个结果。当您通过单个 zipcode
:
geo = Geokit::Geocoders::MultiGeocoder.geocode('452001')
geo.all.map{|i| i.full_address}
# => ["Mičurinova, Subotica 452001, Serbia", "Republic of Bashkortostan, Russia, 452001", "Indore, Madhya Pradesh 452001, India"]
如您所见,在三个不同的位置发现了相同的 zipcode
。您可以 select 手动选择您需要的那个:
geo.all.find{|i| i.country == 'India'}
或者您可以向地理编码服务提供更多信息(如果可能):
def zip_and_city_match
zip_and_country = self.zip + " " + self.country
geo = Geokit::Geocoders::MultiGeocoder.geocode(zip_and_country)
# => should return only one result
end