5

Lucene(4.0.0)の最新バージョンで地理検索機能を試しています。要件は簡単です:円の内側のポイントを取得します(中心と半径はクエリ条件として渡されます)。各結果の中心までの距離を出力する API が見つからないため、各結果の緯度と経度を取得してから距離を計算する必要があります。誰でも助けることができますか?コードを以下に示します。

SpatialContext sc = SpatialContext.GEO;
SpatialArgs args = new SpatialArgs(SpatialOperation.Intersects,
              sc.makeCircle(lo, la, DistanceUtils.dist2Degrees(dist, DistanceUtils.EARTH_MEAN_RADIUS_KM)));
Filter geo_filter = strategy.makeFilter(args);
try {
    Sort chainedSort = new Sort(sfArray).rewrite(searcher);
    TopDocs docs = searcher.search(new MatchAllDocsQuery(), geo_filter, 10000, chainedSort);
    logger.debug("search finished, num: " + docs.totalHits);
    for (ScoreDoc scoreDoc : docs.scoreDocs){
        Document doc = searcher.doc(scoreDoc.doc);
        double la1 = Double.parseDouble(doc.get("la"));
        double lo1 = Double.parseDouble(doc.get("lo"));
        double distance = getDistance(la1, lo1, la, lo); // have to calc distance by myself here, not cool
    }
} catch (IOException e) {
    logger.error("fail to get the search result!", e);
}

Lucene 3.X で距離を取得するのは簡単ですが、Lucene 4.0.0 で地理 (空間) 検索に精通している人はいますか?

4

1 に答える 1

6

フィールドからの緯度と経度があります。次に、クエリ円の中心点からの距離を計算する必要があります。コードでは、これは次のようになります。

double distDEG = sc.getDistCalc().distance(args.getShape().getCenter(), lo1, la1);
double distKM = DistanceUtils.degrees2Dist(distDEG, DistanceUtils.EARTH_MEAN_RADIUS_KM);

悪くない; え?(ps Lucene 4 空間の多くを書きました)

于 2012-11-06T06:27:52.703 に答える