Leafletマップで使用するために、Opa アプリケーションにGeoJSONを保存しています。
これまでのところ、 Opa 型から正しい GeoJSON として BSON に変換され、Leaflet JS によって適切に使用される方法で、統合された MongoDB データベースでオブジェクトPoint
をサポートすることができました。LineString
問題は、JSON フィールドcoordinates
が異なるジオメトリ オブジェクトに対して異なる型を持つことです。点の場合は位置 (数値の配列)、文字列の場合は位置の配列 (数値の配列の配列)、点の配列の配列 (数値の配列の配列の配列) ですMultiLineStrings
。
{ type: "Point", coordinates: [102.0, 0.5] }
{ type: "LineString", "coordinates": [[102.0, 0.0], [103.0, 1.0]] }
...
このため、フィールドに頼ってtype
幾何学的オブジェクトを区別することはできません。Opa のドキュメントによると、「合計の複数のケース (つまり、レコード) が同じラベルを共有している場合、このラベルは各ケースで同じタイプでなければなりません。」したがって、レコード タイプを区別するフィールドPoint
を追加することはできません。LineString
さまざまなタイプが埋め込まれた合計タイプを使用する必要があります。
type Article.geo_json_point =
{
string `type`,
list(float) coordinates,
};
type Article.geo_json_multipoint =
{
string `type`,
list(list(float)) coordinates,
};
type Article.geo_json =
{ Article.geo_json_point Point } or
{ Article.geo_json_multipoint LineString } or
{ Null };
type Article.t = {
Article.id id,
Article.geo_json location,
... // some other fields
};
database mydb {
Article.t /article[{id}]
/article[_]/location = {Null}
/article[_]/location/Point/`type` = "Point"
/article[_]/location/LineString/`type` = "LineString"
}
MongoDBのドキュメントによると、コレクションごとに作成できる地理空間インデックスは 1 つだけです。この場合、インデックスを作成できる GeoJSON を正しく保存できます。
$ mongo mydb
> db.article.findOne({}, {_id:0, location:1})
{
"location" : {
"Point" : {
"type" : "Point",
"coordinates" : [
18.089788,
51.762638
]
}
}
}
location.Point
しかし、どちらかまたはlocation.LineString
両方ではなく、インデックスを作成できます...
OpaでGeoJSONデータの地理空間インデックスを適切に行うには? DBインターフェースと型システムで可能ですか、それとも制限が多すぎますか? 助けやアドバイスをいただければ幸いです。