Создание запроса PostGIS с помощью Rails - PullRequest
3 голосов
/ 24 августа 2010

Я использую PostGIS (1.5.1) с Rails (3.0.0rc) и Google Map (v3), и я ищу способ запроса базы данных для получения всех точек в пределах многоугольника (в частности,, границы области просмотра карты).В настоящее время я отправляю на сервер координаты границ следующим образом:

google.maps.event.addListener(map, 'bounds_changed', function() {
  var bounds = map.getBounds();
  var ne = bounds.getNorthEast();
  var sw = bounds.getSouthWest();
  var yMaxLat = ne.lat();
  var xMaxLng = ne.lng();
  var yMinLat = sw.lat();
  var xMinLng = sw.lng();
  //alert("bounds changed");
  updateMap(yMaxLat, xMaxLng, yMinLat, xMinLng);
});

function updateMap(yMaxLat, xMaxLng, yMinLat, xMinLng) {
  jQuery.getJSON("/places", { "yMaxLat": yMaxLat, "xMaxLng": xMaxLng, "yMinLat": yMinLat, "xMinLng": xMinLng }, function(json) {
    if (json.length > 0) {
      for (i=0; i<json.length; i++) {
        var place = json[i];
        var category = json[i].tag;
        addLocation(place,category);
      }
    }
  });
}

Затем в моем контроллере:

format.js do
  xMinLng = params[:xMinLng]
  yMinLat = params[:yMinLat]
  xMaxLng = params[:xMaxLng]
  yMaxLat = params[:yMaxLat]

  @map_places = Place.find(:all, :conditions => ["geom && ?", Polygon.from_coordinates([[[xMinLng, yMinLat], [xMinLng, yMaxLat], [xMaxLng, yMaxLat], [xMaxLng, yMinLat], [xMinLng, yMinLat]]], 4326)])
  render :json => @map_places
end

Я основываю свой запрос на thisпример , но на самом деле он работает не так, как ожидалось - большинство точек отображаются, когда карта масштабирована прямо, а не те, которые находятся ближе к международной линии дат (т.е. в Австралии и Новой Зеландии).Точки вообще не отображаются при увеличении карты для любого региона земного шара.Я читал кое-что о том, что тип географии PostGIS более подходит для такого типа запросов, но я не думаю , что такой тип поддерживается GeoRuby (он поддерживается GeoDjango).Вывод из моей консоли для такого запроса ниже:

Started GET "/places?yMaxLat=63.93767251746141&xMaxLng=43.033828125&yMinLat=36.88016688406946&xMinLng=-39.407578125" for 127.0.0.1 at Tue Aug 24 12:11:41 +0100 2010
Processing by PlacesController#index as JSON
Parameters: {"xMinLng"=>"-39.407578125", "yMaxLat"=>"63.93767251746141", "xMaxLng"=>"43.033828125", "yMinLat"=>"36.88016688406946"}
Place Load (0.4ms)  SELECT "places".* FROM "places"
Place Load (0.8ms)  SELECT "places".* FROM "places" WHERE (geom && '0103000020E6100000010000000500000052B81E852BB443C0DF0CF74EA970424052B81E852BB443C0686D2EA705F84F40AE47E17A54844540686D2EA705F84F40AE47E17A54844540DF0CF74EA970424052B81E852BB443C0DF0CF74EA9704240')
Completed 200 OK in 136ms (Views: 3.4ms | ActiveRecord: 1.2ms)

Каков наилучший способ создания такого запроса?Я использую драгоценные камни GeoRuby иatial_adapter со своим проектом, но я изо всех сил пытаюсь найти много информации об их использовании, как я описал выше.Может быть, лучше использовать дистанционный запрос?Спасибо!

РЕДАКТИРОВАТЬ: моя миграция выглядит следующим образом:

class CreatePlaces < ActiveRecord::Migration
  def self.up
    create_table :places do |t|
      t.string :city_name
      t.integer :country_id, :null => false
      t.point :geom, :null => false, :with_z => true, :srid => 4326
      t.string :name, :null => false
      t.string :tag, :null => false

      t.timestamps
    end
add_index :places, :geom, :spatial => true
  end

  def self.down
    drop_table :places
  end
  remove_index :places, :geom
end

Ответы [ 3 ]

3 голосов
/ 25 августа 2010

Получите стандартную карту мира (нулевая долгота в середине, линия даты по краям).Нарисуйте угловые точки вашего ящика на карте.Соединяйте эти точки, используя только те линии, которые остаются внутри карты.Это окно, которое запрашивает базу данных.Вот почему ваши очки Aus / NZ не выходят из запроса.Вы должны либо использовать тип географии, либо уведомление, когда ваш блок пересекает дату и разделить его на два непересекающихся блока запроса.

1 голос
/ 26 августа 2010

Спасибо за весь вклад - я боюсь, что это на самом деле оказалось огромной ошибкой n00b с моей стороны, из-за того, что корреляция между x / y и lng / lat была перепутана, следовательно, почему точки на карте показалиотлично при уменьшении, но исчез при увеличении. Я бы настоятельно рекомендовал QGIS (спасибо scw на https://gis.stackexchange.com/ за предложение) всем, кто начинает с ГИСЯ сразу увидел ошибку, когда точки были показаны вверх ногами!Еще раз спасибо всем!

Кстати, немного удивительно, что точки в Новой Зеландии / Австралии хорошо отображаются, даже когда ограничивающая рамка пересекает международную линию дат, хотя это может измениться, если я добавлю еще несколько точек в этой области.1009 *

0 голосов
/ 24 августа 2010

Может быть два разных типа проекции. Убедитесь, что проекция в базе данных и в вашем приложении одинакова.

...