Ruby on rails 用Rails构建PostGIS查询

Ruby on rails 用Rails构建PostGIS查询,ruby-on-rails,postgis,Ruby On Rails,Postgis,我正在使用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

我正在使用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);
      }
    }
  });
}
我是基于我的查询,但它的行为并不像预期的那样-大多数点都是在地图被放大时显示的,而不是那些接近国际日期线的点(例如在澳大利亚和新西兰)。当地图被放大时,地球上任何区域的点都不会显示。我读过一些关于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)
构建这样一个查询的最佳方式是什么?我在我的项目中使用gemby和spatial_适配器gems,但是我很难找到关于使用它们的更多信息,正如我上面所描述的。距离查询可能是更好的方法吗?谢谢

编辑:我的迁移如下:

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
class CreatePlacesfalse
t、 点:geom,:null=>false,:with_z=>true,:srid=>4326
t、 字符串:name,:null=>false
t、 字符串:tag,:null=>false
t、 时间戳
结束
添加索引:places,:geom,:spatial=>true
结束
def自动关闭
放置表格:位置
结束
删除索引:位置,:几何
结束

可能有两种不同类型的投影。确保投影在数据库和应用程序中是相同的。

< P>求出一个标准的世界地图(中间的零经度,边缘的日期线)。在地图上绘制长方体的角点。仅使用留在地图内的线连接这些点。这就是查询数据库的框。这就是为什么您的澳大利亚/新西兰积分没有从查询中出来。您必须使用地理类型,或者在框为日期线交叉时通知,并将其拆分为两个非交叉查询框。

感谢您的所有输入-恐怕这实际上是我的一个巨大n00b错误,混淆了x/y和lng/lat之间的相关性,因此,地图上的点在缩小时显示良好,但在放大时消失。我完全推荐(感谢on的建议)任何一个开始使用GIS的人,当点颠倒显示时,我立即看到了错误!!再次感谢大家


顺便说一句,令人稍感意外的是,即使边界框穿过国际日期线,新西兰/澳大利亚的点也会显示得很好,尽管如果我在该区域添加更多点,情况可能会有所改变。

感谢您的回复,我已经在上面加入了我的数据库迁移,以提供更多细节……嗯,它看起来像是一个有效的SRID。您是否检查过这些点是否实际显示在SQL select中?我会尝试将问题缩小到数据库或谷歌地图。我发现有些情况下,GMAP不会将点放在地图上的某个位置。英国和非洲的点显示得很好,但只在某个特定的缩放级别上-大约3或更低。新西兰和澳大利亚的点从未出现,但我假设这可能是日期线问题……谷歌地图似乎发送边界很好,我认为这是我的查询的问题-如果我将所有点呈现为JSON(因此没有查询),它们会完美地显示在地图上!嗯,这个查询可能有问题,但似乎对另一个人有用。也许您可以尝试使用普通sql而不是Georguby来执行查询,至少看看它返回什么?下面是上面的文档:
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