in baremaps-core/src/main/java/org/apache/baremaps/geocoder/openstreetmap/OpenStreetMapDocumentMapper.java [42:103]
public Document apply(Element element) {
var document = new Document();
document.add(new StoredField("osm_id", element.getId()));
document.add(new StoredField("osm_type", element.getClass().getSimpleName()));
if (element.getTags().containsKey(OsmTags.NAME.key())) {
document.add(
new TextField(OsmTags.NAME.key(), element.getTags().get(OsmTags.NAME.key()).toString(),
Field.Store.YES));
}
if (element instanceof Node node) {
document.add(LatLonShape.createIndexableFields("polygon", node.getLat(), node.getLon())[0]);
document.add(new StoredField("latitude", node.getLat()));
document.add(new StoredField("longitude", node.getLon()));
}
if (element.getGeometry() != null
&& element.getGeometry().getGeometryType().equals(Geometry.TYPENAME_LINESTRING)) {
logger.debug("Geometry linestring ignored as not supported by Lucene Polygon.fromGeoJson: {}",
element);
}
if (element.getGeometry() != null
&& !element.getGeometry().getGeometryType().equals(Geometry.TYPENAME_POINT)
&& !element.getGeometry().getGeometryType().equals(Geometry.TYPENAME_LINESTRING)) {
// JTS to GeoJSON
var geojsonWriter = new GeoJsonWriter();
// Remove crs field in GeoJSON as the field content is incompatible between
// Lucene Polygon.fromGeoJSON and GeoJsonWriter.
// Avoid "crs must be CRS84 from OGC, but saw: EPSG:4326"
// See:
// https://github.com/apache/lucene/blob/ef42af65f27f7f078b1ab426de9f2b2fa214ad86/lucene/core/src/java/org/apache/lucene/geo/SimpleGeoJSONPolygonParser.java#L180
// https://github.com/locationtech/jts/blob/ee59b591f15b5150516393d3ba0b49e46a113fc9/modules/io/common/src/main/java/org/locationtech/jts/io/geojson/GeoJsonWriter.java#L226
geojsonWriter.setEncodeCRS(false);
// Assume that Geometry is in EPSG:4326/WGS84 for Lucene Polygon.fromGeoJSON
var geojson = geojsonWriter.write(element.getGeometry());
// GeoJSON to Lucene Polygon
try {
var polygons = Polygon.fromGeoJSON(geojson);
for (Polygon polygon : polygons) {
// LatLonShape.createIndexableFields can create multiple polygons out of a single polygon
// through tesselation
for (Field field : LatLonShape.createIndexableFields("polygon", polygon)) {
document.add(field);
}
}
} catch (Exception e) {
// ignore geometry
logger.debug("Geometry ({}) failed indexing caused by: {}",
element, e);
}
}
if (element.getTags().containsKey(OsmTags.POPULATION.key())) {
var population = Long.parseLong(element.getTags().get(OsmTags.POPULATION.key()).toString());
document.add(new NumericDocValuesField(OsmTags.POPULATION.key(), population));
document.add(new StoredField(OsmTags.POPULATION.key(), population));
}
return document;
}