У нас есть требование, где мы должны хранить координаты на восток и север, а затем искать координаты как пространственные данные. Координаты можно искать с помощью радиуса или ограничительной рамки. До сих пор я могу найти справочные документы или примеры только для Lat / Long. Ниже приведен код, который я использую для загрузки координат в Lucene
SpatialContextFactory spatialContextFactory = null;
SpatialContext ctx = null;
SpatialPrefixTree grid = null;
SpatialStrategy strategy = null;
spatialContextFactory = new SpatialContextFactory();
spatialContextFactory.geo = false;
this.ctx = new SpatialContext(spatialContextFactory);
//EPSG:27700 Projected Bounds: 1393.0196, 13494.9764, 671196.3657, 1230275.0454
Rectangle rectangle = new RectangleImpl(1393.0196, 671196.3657, 13494.9764, 1230275.0454, this.ctx);
this.grid = new QuadPrefixTree(this.ctx, rectangle, 11);
this.strategy = new RecursivePrefixTreeStrategy(grid, "location");
, а затем для загрузки координат, как показано ниже.
Shape pointXY = ctx.readShapeFromWkt(String.format("POINT(%s %s)", rs.getString("X"), rs.getString("Y")));
Point pt = (Point) pointXY;
for(IndexableField f:
strategy.createIndexableFields(pointXY))
{
d.add(f);
}
d.add(new StoredField(strategy.getFieldName(), pt.getX()+" "+pt.getY()));
Для получения результатов я использую приведенный ниже код упоминания .
Directory directory = FSDirectory.open(indexDir.toPath());
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
Point p = ctx.getShapeFactory().pointXY(x, y);
SpatialArgs args = new SpatialArgs(SpatialOperation.IsWithin, ctx.getShapeFactory().pointXY(x, y));
Query query = strategy.makeQuery(args);
int limit = 1000;
TopDocs topDocs = searcher.search(query, limit);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
С приведенным выше кодом я не получаю желаемых результатов. Может кто-нибудь сказать мне, что мне нужно изменить здесь.