简体   繁体   English

Ruby on Rails,Mongoid和Geocoder

[英]Ruby on rails, mongoid and Geocoder

I have this error when I try to do an API call using geocoder, geojson and rails. 当我尝试使用geocoder,geojson和rails进行API调用时出现此错误。 Here is the error : 这是错误:

Showing /Users/<User>/Sites/<Sites>/<Site>/app/views/api/exam_centers/index.json.rabl where line #2 raised:

error processing query: ns=db-<site>.exam_centers limit=30Tree: GEONEAR  field=coordinates maxdist=0.00313922 isNearSphere=1
Sort: {}
Proj: {}
 planner returned error: unable to find index for $geoNear query (2)

I don't understand the problem. 我不明白这个问题。 Here is my code : 这是我的代码:

javascript/api.js javascript / api.js

function api_get_exam_centers_by_coordinates(latitude, longitude, onSuccess, radius) {
    var url = '/api/exam_centers?latitude='+latitude+'&longitude='+longitude;
    if (radius) url += '&radius='+radius;
    $.getJSON(url, onSuccess);
}

controller/api/exam_centers_controller.rb 控制器/api/exam_centers_controller.rb

class Api::ExamCentersController < ApplicationController
  caches_action :index, :cache_path => Proc.new {|c| c.request.url }, :expires_in => 1.day, :unless => proc { params[:latitude].present? }

  def index
    if params[:latitude].present? && params[:longitude].present?
      radius = if params[:radius].blank?
                 20
               else
                 params[:radius].to_f / 1000
               end
      @center = [params[:latitude], params[:longitude]]
      @exam_centers = ExamCenter.near([params[:latitude], params[:longitude]], radius, units: :km).limit(30)
    end
  end

  def show
    @exam_center = ExamCenter.find params[:id]
  end
end

views/api/exam_centers/base.geojson.rabl views / api / exam_centers / base.geojson.rabl

node :type do
  'Feature'
end

node :geometry do |examcenter|
  {
    type: 'Point',
    coordinates: examcenter.coordinates
  }
end

node :properties do |examcenter|
  data = {}

  [:id, :title, :adress, :zipcode, :city, :type, :link].map do |field|
    data[field] = examcenter.send field
  end

  data[:is_la_poste] = examcenter.isLaPoste?
  data[:is_sgs] = examcenter.isSGS?
  data[:is_codengo] = examcenter.isCodengo?

  data.keep_if {|key, value| value.present?}
end

views/api/exam_centers/index.json.rabl views / api / exam_centers / index.json.rabl

object false

node :type do
  'FeatureCollection'
end


child @exam_centers => :features do
  extends 'api/exam_centers/base'
end


 #collection @exam_centers

 #extends 'api/exam_centers/show'

views/api/exam_centers/show.json.rabl views / api / exam_centers / show.json.rabl

object @exam_center

attributes :id, :coordinates, :title, :adress, :zipcode, :city, :type, :link

views/exam_centers/index.html.erb views / exam_centers / index.html.erb

<div class="map-container">

  <div id="map-exams" class=" hidden-xs hidden-sm" style="<% if !@department.blank?  && params[:city].blank? %> display: none !important;<% end %>" >

    <div class="map-refresh-controls" style="<% if !@department.blank?  && params[:city].blank? %>display: none !important;<% end %>">
      <a id="map-refresh-btn-exam" class="btn btn-primary btn-large hide ">
        <%= fa_icon 'refresh'  %> Relancer la recherche ici
      </a>
      <div class="map-auto-refresh-exam hide">
        <div class="checkbox">
          <label>
            <input class="map-auto-refresh-checkbox" type="checkbox">
            Rechercher quand je déplace la carte
          </label>
        </div>
      </div>
      <div class="map-loader"><i class="icon-spinner icon-spin icon-large"></i> Chargement... </div>
    </div>
  </div>


  <div id="navRightWrapper" style="<% if !@department.blank?  && params[:city].blank? %> width: 100% !important;<% end %>">
    <form class="search-form">
      <div id="navRight-search-box" class="navRight-section input-group">
        <span class="input-group-addon" id="basic-addon1" style="height: 46px !important; padding-top: 14px !important;"><%= fa_icon 'search' %></span>
        <input id="search-box-exam-2" class="form-control input-lg dept_list" placeholder="Où cherchez-vous un centre d'examen" type="text" />
        <!-- suppression id="input_home_large" car -->
      </div>
    </form>
    <div id="navRight-filter-box" class="navRight-section" style="margin-top: 10px !important;">
      <span style="margin-right: 7px">Trier par</span>
      <div class="btn-group" role="group">
        <button class="btn btn-default" type="button" id="sorting_by_la_poste">La Poste </button>
        <button class="btn btn-default" type="button" id="sorting_by_sgs">SGS</button>
        <button class="btn btn-default" type="button" id="sorting_by_codengo">Codengo </button>
      </div>
    </div>
    <div id="navRight-middle">
      <div class="exams-loader hide"><i class="icon-spinner icon-spin icon-large"></i> Chargement...</div>
      <div id="listResultsExams">
        <%= render partial: 'exam_centers/exam_center', collection: @exam_centers %>
      </div>
    </div>
  </div>

</div>

<script id="ExamCenterListTpl" type="text/template">

  {{#features}}

  <div class="entry-line-small" data-position="{{geometry.coordinates}}" data-distance-from-center="{{properties.distance_from_center}}" data-marker="{{properties.title}}" data-name="{{properties.title}}"  data-is-la-poste="{{properties.is_la_poste}}" data-is-sgs="{{properties.is_sgs}}" data-is-codengo="{{properties.is_codengo}}">
    <div class="row">
      <div class="entry-line-small-text tiny col-md-8 col-sm-8">
        <div class="entry-line-small-title">
          <h6 class="title"><a class="exam-centers-listing-title" href="#" data-position="{{geometry.coordinates}}" data-marker="{{properties.title}}">{{properties.title}}</a></h6>
          <div class="listing-address">
            {{properties.adress}} {{properties.zipcode}}  {{properties.city}} {{properties.type}}
          </div>
        </div>
      </div>
    </div>
  </div>
  {{/features}}

</script>

<script id="ExamCenterPopupTpl" type="text/template">
  <strong><a id="exam-center-title-popup-link" href="#">{{ title }}</a></strong>
  <br />
  <div class="listing-address" style="line-height: 11px">
    {{ adress }} {{ zipcode }} {{ city }} {{ type }}
  </div>
</script>


    <%= javascript_include_tag "mapbox.js" %>

Someone know what is this error ? 有人知道这是什么错误吗?

To use geoNear you need a geospatial index in your collection. 要使用geoNear ,您的收藏中需要一个地理空间索引。

Check that you have the good index in your model as in: 检查模型中的index是否良好,如下所示:

https://docs.mongodb.com/ruby-driver/master/tutorials/6.1.0/mongoid-indexes https://docs.mongodb.com/ruby-driver/master/tutorials/6.1.0/mongoid-indexes

class Person
  include Mongoid::Document
  field :location, type: Array

  index({ location: "2d" }, { min: -200, max: 200 })
end

You should also run the rake task bin/rake db:mongoid:create_indexes to create the index. 您还应该运行rake任务bin/rake db:mongoid:create_indexes创建索引。 Also you may try the Mongo query inside your rails console. 您也可以在Rails控制台中尝试Mongo查询。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM