3

Rails(3.0.0rc)とGoogle Map(v3)でPostGIS(1.5.1)を使用しており、データベースにクエリを実行して、ポリゴン内のすべてのポイント(具体的には境界)を取得する方法を探しています。マップビューポートの)。現在、境界の座標をサーバーに送信しています。

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

この例に基づいてクエリを実行していますが、実際には期待どおりに動作していません。ほとんどのポイントは、地図をズームアウトしたときに表示されますが、国際日付変更線に近いポイント(オーストラリアとニュージーランドなど)では表示されません。 。地球のどの地域でも、地図を拡大してもポイントはまったく表示されません。私は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
4

3 に答える 3

3

世界の標準的な地図を取得します(中央に経度がゼロ、端に日付線があります)。ボックスのコーナーポイントをマップにプロットします。マップ内にとどまる線のみを使用して、これらのポイントを結合します。これが、データベースにクエリを実行しているボックスです。これが、Aus/NZポイントがクエリから出てこない理由です。地理タイプを使用するか、ボックスが日付変更線と交差していることに注意して、交差しない2つのクエリボックスに分割する必要があります。

于 2010-08-25T18:02:27.980 に答える
1

すべての入力に感謝します-これは実際には、x/y と lng/lat の相関関係を混同する際に、私の側で大規模な n00b エラーであることが判明したため、ズーム時にマップ上のポイントが正常に表示された理由GISを使い始めた人には、 QGISを徹底的にお勧めします(提案してくれたhttps://gis.stackexchange.com/のscwに感謝します)。ポイントが表示されたときにすぐにエラーが表示されました逆さまに!!ありがとうございました!

ところで、少し驚くべきことに、境界ボックスが国際日付変更線を横切っている場合でも、NZ/オーストラリアのポイントは問題なく表示されますが、その地域にさらにポイントを追加すると、状況が変わる可能性があります.

于 2010-08-25T20:35:21.277 に答える
0

2 つの異なるタイプの投影が行われている可能性があります。プロジェクションがデータベースとアプリケーションで同じであることを確認してください。

于 2010-08-24T15:12:04.803 に答える