如何使用推文中的位置字段从地理编码器结果中获取坐标

时间:2014-04-02 18:28:14

标签: ruby-on-rails twitter rails-geocoder

我正在Ruby on Rails中开发一个API mashup,并试图根据hash标签从twitter获取推文。获取后我试图在谷歌地图上显示它们。我正在使用Gmaps4rails,Geocoder,Twitter宝石。  为了识别用户的位置,我使用推文中的位置字段并对其进行地理编码。

问题是我没有得到坐标。到目前为止,我可以根据哈希标签及其位置来获取推文。当我尝试对位置进行地理编码并在数组中创建坐标时,我得到了一个nil类异常。

搜索标签的代码

def search(hashtag)
client = Twitter::REST::Client.new do |config|
config.consumer_key        = Rails.application.config.twitter_key
config.consumer_secret     = Rails.application.config.twitter_secret
config.access_token        = oauth_token
config.access_token_secret = oauth_secret
end
geoloc="53.349740,-6.256845,500mi"
tweets = client.search(hashtag,{:geocode => geoloc ,:lang => "en" , :count => 15})
return tweets

对于地理编码,我在控制器

中尝试了这些变化

试验1。

def search
@tweets=current_user.search(tweet_params[:hashtag])
@tweets.each do |tweet|
@tweet["latlang"] = Geocoder.search(tweet.user.location).coordinates
end
end

试验2。

def search
 @tweets=current_user.search(tweet_params[:hashtag])
 @tweets.each do |tweet|
 @loc<<
 {
  :lat => Geocoder.search(tweet.user.location.to_s).first.coordinates.first,
  :lng => Geocoder.search(tweet.user.location.to_s).first.coordinates.last
}
end
end

试用3.(确保应该处理空位置的推文)

def search
@tweets=current_user.search(tweet_params[:hashtag])
@tweets.each do |tweet|
 if(tweet.user.location.present?)
@loc<<
{
:lat => Geocoder.search(tweet.user.location.to_s).first.coordinates.first,
:lng => Geocoder.search(tweet.user.location.to_s).first.coordinates.last
 }
else
continue
end
end
end

或者我可以创建一个新数组,我可以在其中推送所有值

@location<<
{
:latlng => Geocoder.search(tweet.user.location).coordinates
}

我收到的错误如“未定义的方法”&lt;&lt;&lt;为零:NilClass“

谢谢

1 个答案:

答案 0 :(得分:0)

我在 Syed Aslam

的帮助下找到了解决方案

获取NilClass异常的问题是通用的,因为我在使用之前没有定义数组。

控制器代码

def search
@tweets=current_user.search(tweet_params[:hashtag])
@loc=[]
@tweets.each do |tweet|
 if(tweet.user.location.present?)
@loc<<
{
:lat => Geocoder.search(tweet.user.location.to_s).first.coordinates.first,
:lng => Geocoder.search(tweet.user.location.to_s).first.coordinates.last
 }
else
end
end
end

查看代码

<h2><%= @loc.to_json %></h2>

添加标记的脚本

</div>
<script type="text/javascript">
handler = Gmaps.build('Google');
handler.buildMap({ provider: {}, internal: {id: 'map'}}, function(){
markers = handler.addMarkers(<%=raw @loc.to_json %>);
handler.bounds.extendWith(markers);
handler.fitMapToBounds();
});
</script>