在一个模型中对多个地址进行地理编码

时间:2015-04-15 16:25:42

标签: ruby-on-rails google-maps-api-3 geocoding

我正在尝试使用地理编码器在模型中对2个地址进行地理编码,但我无法按照我的意愿使用gem。这是我应用于我的模型的代码:

class Sender < ActiveRecord::Base
validates_presence_of :source_address
validates_presence_of :destination_address
geocoded_by :source_address, :latitude => :latitude1, :longitude => :longitude1
geocoded_by :destination_address, :latitude2 => :latitude2, :longitude2 => :longitude2

def update_coordinates
    geocode
    [latitude1, longitude1, latitude2, longitude2]
end

after_validation :geocode  

以下是views / senders / show.html.erb的代码:

 <%= @sender.latitude1 %>
   <%= @sender.longitude1 %>
   <%= @sender.latitude2 %>
   <%= @sender.longitude2 %>

结果:35.6894875 139.6917064 - 是不是应该寄回2个地址信息?

这是我的js:

<script type="text/javascript">
function initialize() {
  var source = new google.maps.LatLng(<%= @sender.latitude1 %>, <%= @sender.longitude1 %>);
  var dest = new google.maps.LatLng(<%= @sender.latitude2 %>, <%= @sender.longitude2 %>);
  var mapOptions = {
    center: source,
    zoom: 8

  }
  var mapOptions2 = {
    center: dest,
    zoom: 8

  }

  var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
  var map2 = new google.maps.Map(document.getElementById('map_canvas2'), mapOptions2);

  var marker = new google.maps.Marker({
    position:source,
    map: map
  });
  var marker2 = new google.maps.Marker({
    position:dest,
    map: map2
  });
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>

2 个答案:

答案 0 :(得分:1)

提到问题和解决方案here

将以下before_save :geocode_endpoints private #To enable Geocoder to works with multiple locations def geocode_endpoints if from_changed? geocoded = Geocoder.search(loc1).first if geocoded self.latitude = geocoded.latitude self.longitude = geocoded.longitude end end # Repeat for destination if to_changed? geocoded = Geocoder.search(loc2).first if geocoded self.latitude2 = geocoded.latitude self.longitude2 = geocoded.longitude end end end 和相应的方法添加到模型中以解决问题。不要忘记重复第二个位置(可能是目的地)的部分代码:

var app = angular.module("myApp", [])

app.directive('testAlert',function() {
  return {
     restrict: 'E',
     template: '<button ng-click="alertClick()">Test</button>',
     link: function (scope) {
        scope.alertClick = function () {
        alert('Welcome!');
     };
   }
  }
});

答案 1 :(得分:0)

重写

def function
...
end

为:

def update_coordinates
  geocode
  [latitude, longitude, latitude2, longitude2]
end

还有:

geocoded_by :destination_address, :latitude => :latitude2, :longitude => :longitude2

您也不需要:latitude => :lat, :longitude => :lon

geocoded_by :source_address, ...

最后,在验证记录后自动获取坐标。所以你可以在你的版本中没有update_coordinates(或function)并安排show动作的视图,如下所示:

<%= @sender.latitude %>
<%= @sender.longitude %>
<%= @sender.latitude2 %>
<%= @sender.longitude2 %>