2017-09-27 4 views
1

MongoDBを使用したジオ空間Webアプリケーションで作業しています。私はさまざまなカテゴリ(COUNTRYSTATEなど)のコレクションにたくさんのポリゴンを持っていて、どれがSTATECOUNTRYであるか知りたがっていますが、場合によっては隣接の境界がCOUNTRYの境界にSTATE私は交差点を照会するとき、私は2つの国を取得します。ポリゴンオーバーラップ率

どの国が親であるかを知るために、国と両国の重複率を計算したいと考えています。私は見てきましたが、私はこの種の操作でライブラリを見つけられませんでした。この種のアルゴリズムを実行するのはあまり良くありません。


EDIT:

func findParent(state *GeoEntity) GeoEntity{ 
    session, err := mgo.Dial("localhost") 
    check(err) 
    defer session.Close() 

    entities := session.DB("geo").C("entity") 

    query := bson.M{ 
     "geometry": bson.M{ 
      "$geoIntersects": bson.M{ 
       "$geometry": state.Geometry, 
      }, 
     }, 
     "type": "COUNTRY", 
    } 

    var countries []GeoEntity 
    err = entities.Find(query).All(&countries) 
    check(err) 

    var parent GeoEntity 

    if len(countries) > 1 { 
     //TODO: parent = findTheTrueParent(countries, state) 
    } else { 
     parent = countries[0] 
    } 

    return parent 
} 
:これは私が

type GeoEntity struct { 
    ID  bson.ObjectId `json:"id" bson:"_id"` 
    Type  string  `json:"type" bson:"type"` // COUNTRY, STATE, etc. 
    Geometry Geometry  `json:"geometry" bson:"geometry"` 
} 

// GeoJSON entity 
type Geometry struct { 
    Type  string   `json:"type" bson:"type"` 
    Coordinates [][][][]float64 `json:"coordinates" bson:"coordinates"` 
} 

で働いているモデルであり、これは私が今持っているコードの塊である以上、コンテキスト

を追加します

And here is an image example of the problem I'm having.私が質問をするとき、私は両方の国、赤と緑の1つを取得しますが、本当の親はgreeですなし。

+0

golangの地理空間ライブラリはかなりありますが、データの格納方法やこれまでの作業を知らなくても、この質問はあまり一般的ではありません。 – Andrew

+0

Goを使用する前にプレーンなMongoDBクエリを作成しようとしましたか? –

+0

はい、まさに私が示していることです。隣国の境界が国家の境界と重なっているため、mongoクエリは2つの親を返します –

答えて

0

あるポリゴンが常に別のポリゴンの領域(完全にそのポリゴンに含まれている)であると仮定できる場合は、そのポリゴンの中心点を計算するだけで、ポリゴン全体を使用する代わりに、両親に対してテストするためのその時点での非常に小さな正方形。バウンディングボックスがある場合は、中心点を見つけやすくする必要があります。

このようにして、2つの親と重なるエッジで見られる問題を回避します。リージョンがその親の中にあり、重複していないことがわかっている限り、どのリージョンでも機能します。

2つのクエリが必要な場合もありません。state.Geometryを中心点の周りの小さな正方形に置き換え、その代わりにクエリを実行します。

+0

あなたは正しいです!ありがとう! –