gpt4 book ai didi

ruby-on-rails - 使用 Rails 构建 PostGIS 查询

转载 作者:行者123 更新时间:2023-12-04 02:16:34 25 4
gpt4 key购买 nike

我正在将 PostGIS (1.5.1) 与 Rails (3.0.0rc) 和 Google Map (v3) 一起使用,我正在寻找一种查询数据库以检索多边形内所有点的方法(特别是, map 视口(viewport)的边界)。目前我正在将边界的坐标发送到服务器:

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);
}
}
});
}

然后在我的 Controller 中:

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 example ,但它并没有真正按预期运行 - 大多数点在 map 缩小时显示,但不显示靠近国际日期变更线的点(即澳大利亚和新西兰)。对于地球上的任何区域,本地图放大时,这些点根本不会显示。我读过一些关于 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 和 spatial_adapter gem,但我正在努力寻找有关如何使用它们的大量信息,如上所述。距离查询可能是更好的方法吗?谢谢!

编辑:我的迁移如下:

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

最佳答案

拿出一张标准的世界地图(中间为零经度,边缘为日期变更线)。在 map 上绘制方框的角点。加入这些点,只使用留在 map 内的线。那就是查询数据库的框。这就是为什么您的 Aus/NZ 积分不在查询范围之内的原因。您必须要么使用地理类型,要么在您的框跨越日期变更线时注意并将其拆分为两个非交叉查询框。

关于ruby-on-rails - 使用 Rails 构建 PostGIS 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3555840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com