如何按完整地址进行地理编码,或者如果完整地址失败,则仅对邮政编码进行地理编码?

问题描述

如果我提供了一个有效的地址,Geocoder gem 会一直很好地工作。但如果地址无效,则无法进行地理编码。

如果按完整地址进行地理编码失败,我如何通过邮政编码进行地理编码?

geocoded_by :address
after_validation :geocode

def address
  [street,city,province,country,postal_code].compact.join(",")
end

有什么想法吗?

谢谢

解决方法

不幸的是,它有点老套,但您必须覆盖 geocode 方法。这样的事情应该可以解决问题:

# Override Geocoder's `geocode` method
def geocode
  # Initially just call the original method as intended.
  super

  # Check to see if geocoding failed.
  if latitude.blank? && longitude.blank?
    # Now manually set the `user_address` key to only `postal_code`,instead of the original value of `address`.
    self.class.geocoder_options[:user_address] = postal_code 

    # Now call the original method again.
    super 
  end
end

我可能会在 gem 上打开 PR - 你的问题很有趣。某种后备选项肯定会非常有用。 :-)

,

我最终使用了不同的解决方案。不确定这是否是最好的处理方式,但是:

after_validation :geocode_address

def geocode_address
  results = Geocoder.search(full_address)
  if results.empty?
    postal_code_search = Geocoder.search(postal_code)
    if !postal_code_search.empty?
      lat_long = postal_code_search.first.coordinates
    end
  else
    lat_long = results.first.coordinates
  end
  if lat_long && !lat_long.empty?
    self.latitude = lat_long[0]
    self.longitude = lat_long[1]
  end
end
,

我遇到了同样的问题。

软件 版本
Ruby v2.6.6
Rails v5.2.5
地理编码器 v1.6.4

我的方法是给 geocode_by 方法一个块,如文档部分 Custom Result Handling 中所述。

就我而言,我最终得到了以下代码。我的模型名称是 Job。如果对 API 的请求返回空,我会发出另一个请求,只包含我想要的字段。

geocoded_by :full_address do |job,results|
    if results.empty?
      geo = Geocoder.search(job.city).first
      if geo.present?
        job.latitude = geo.latitude
        job.longitude = geo.longitude
      end
    else
      job.latitude = results.first.latitude
      job.longitude = results.first.longitude
    end
  end

  after_validation :geocode,if: ->(job) { job.will_save_change_to_address? || job.will_save_change_to_city? }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...