added spatial boundingbox support using a 4 sides polygon wkt format
This commit is contained in:
parent
03da34a897
commit
8ed4b8b08d
|
@ -6,19 +6,28 @@ import org.apache.commons.lang3.StringUtils;
|
|||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.http.HttpHost;
|
||||
import org.apache.lucene.spatial3d.geom.GeoPoint;
|
||||
import org.apache.lucene.spatial3d.geom.GeoPolygon;
|
||||
import org.apache.lucene.spatial3d.geom.GeoPolygonFactory;
|
||||
import org.apache.lucene.spatial3d.geom.PlanetModel;
|
||||
import org.elasticsearch.action.bulk.BulkRequest;
|
||||
import org.elasticsearch.action.bulk.BulkResponse;
|
||||
import org.elasticsearch.action.index.IndexRequest;
|
||||
import org.elasticsearch.client.RequestOptions;
|
||||
import org.elasticsearch.client.RestClient;
|
||||
import org.elasticsearch.client.RestHighLevelClient;
|
||||
import org.elasticsearch.common.geo.GeoPoint;
|
||||
import org.elasticsearch.common.geo.builders.CoordinatesBuilder;
|
||||
import org.elasticsearch.common.geo.builders.EnvelopeBuilder;
|
||||
import org.elasticsearch.common.geo.builders.PolygonBuilder;
|
||||
import org.elasticsearch.common.xcontent.XContentType;
|
||||
import org.elasticsearch.geometry.Polygon;
|
||||
import org.locationtech.jts.geom.Coordinate;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
@ -74,10 +83,35 @@ public class BulkUpload {
|
|||
.forEach(s -> {
|
||||
double lat = Double.parseDouble(s.getLat());
|
||||
double lon = Double.parseDouble(s.getLon());
|
||||
GeoPoint geopoint = new GeoPoint(lat, lon);
|
||||
org.elasticsearch.common.geo.GeoPoint geopoint = new org.elasticsearch.common.geo.GeoPoint(lat, lon);
|
||||
s.setGeopoint(geopoint);
|
||||
});
|
||||
// TODO update following check according to new model definition
|
||||
ace.getSpatial()
|
||||
.stream()
|
||||
.filter(s -> Objects.nonNull(s.getBoundingBoxMaxLat())
|
||||
&& Objects.nonNull(s.getBoundingBoxMaxLon())
|
||||
&& Objects.nonNull(s.getBoundingBoxMinLat())
|
||||
&& Objects.nonNull(s.getBoundingBoxMinLon()))
|
||||
.forEach(s -> {
|
||||
double maxlat = Double.parseDouble(s.getBoundingBoxMaxLat());
|
||||
double minlat = Double.parseDouble(s.getBoundingBoxMinLat());
|
||||
double minlon = Double.parseDouble(s.getBoundingBoxMinLon());
|
||||
double maxlon = Double.parseDouble(s.getBoundingBoxMaxLon());
|
||||
CoordinatesBuilder coordinatesBuilder = new CoordinatesBuilder();
|
||||
coordinatesBuilder.coordinate(minlon, maxlat);
|
||||
coordinatesBuilder.coordinate(minlon, minlat);
|
||||
coordinatesBuilder.coordinate(maxlon, minlat);
|
||||
coordinatesBuilder.coordinate(maxlon, maxlat);
|
||||
coordinatesBuilder.coordinate(minlon, maxlat);
|
||||
PolygonBuilder polygonBuilder = new PolygonBuilder(coordinatesBuilder);
|
||||
String wkt = polygonBuilder.toWKT();
|
||||
s.setBoundingbox(wkt);
|
||||
// Coordinate topLeft = new Coordinate(minlon, maxlat);
|
||||
// Coordinate bottomRight = new Coordinate(maxlon, minlat);
|
||||
// EnvelopeBuilder envelopeBuilder = new EnvelopeBuilder(topLeft, bottomRight);
|
||||
// String wkt = envelopeBuilder.toWKT();
|
||||
// s.setBoundingbox(wkt);
|
||||
});
|
||||
if (ace.getSpatial().size()==2) {
|
||||
Spatial uniqueSpatial = new Spatial();
|
||||
boolean uniquePlaceNameFound = ace.getSpatial().stream().filter(s -> s.getPlaceName()!=null).count()==1;
|
||||
|
@ -118,13 +152,13 @@ public class BulkUpload {
|
|||
}
|
||||
}
|
||||
|
||||
if (ace.getTemporal()!=null) {
|
||||
ace.getTemporal().stream()
|
||||
.filter(t->t.getMatchingPeriodOName()!=null)
|
||||
.forEach(t->{
|
||||
t.setPeriodName(t.getMatchingPeriodOName());
|
||||
});
|
||||
}
|
||||
// if (ace.getTemporal()!=null) {
|
||||
// ace.getTemporal().stream()
|
||||
// .filter(t->t.getMatchingPeriodOName()!=null)
|
||||
// .forEach(t->{
|
||||
// t.setPeriodName(t.getMatchingPeriodOName());
|
||||
// });
|
||||
// }
|
||||
|
||||
if (!isCollection) {
|
||||
String uniqueIsPartOf = ace.getUniqueIsPartOf();
|
||||
|
@ -139,15 +173,7 @@ public class BulkUpload {
|
|||
|
||||
String[] splits = ace.getIdentifier().split("/");
|
||||
|
||||
// if (ace.getAatSubjects() != null && ace.getDerivedSubject() != null) {
|
||||
// String aatSource = ace.getAatSubjects().get(0).getId();
|
||||
// ace.getDerivedSubject().forEach(d -> {
|
||||
// d.setSource(aatSource);
|
||||
// });
|
||||
// String [] aatSourceSplit = aatSource.split("/");
|
||||
// String aatSubjectId = aatSourceSplit[aatSourceSplit.length-1];
|
||||
// ace.getAatSubjects().forEach(s -> s.setId(aatSubjectId));
|
||||
// }
|
||||
log.debug("JSON >>>> "+ace.toJson());
|
||||
|
||||
String idES = splits[splits.length-1];
|
||||
request.add(new IndexRequest(elasticSearchIndexName).id(idES)
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
package eu.dnetlib.ariadneplus.elasticsearch.model;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
|
||||
public class AriadneGeoPoint {
|
||||
private float lat;
|
||||
private float lon;
|
||||
|
||||
public float getLat() {
|
||||
return lat;
|
||||
}
|
||||
|
||||
public void setLat(float lat) {
|
||||
this.lat = lat;
|
||||
}
|
||||
|
||||
public float getLon() {
|
||||
return lon;
|
||||
}
|
||||
|
||||
public void setLon(float lon) {
|
||||
this.lon = lon;
|
||||
}
|
||||
|
||||
public AriadneGeoPoint() {
|
||||
}
|
||||
|
||||
public static AriadneGeoPoint fromJson (String json){
|
||||
return new Gson().fromJson(json, AriadneGeoPoint.class);
|
||||
}
|
||||
|
||||
// public static AriadneGeoPoint fromRDFJson(JsonElement json){
|
||||
// AriadneGeoPoint agp = new AriadneGeoPoint();
|
||||
// for (Map.Entry<String, JsonElement> stringJsonElementEntry : json.getAsJsonObject().entrySet()) {
|
||||
// switch (stringJsonElementEntry.getKey()){
|
||||
// case "https://www.ariadne-infrastructure.eu/property/lat":
|
||||
// agp.setLat(stringJsonElementEntry.getValue().getAsJsonArray().get(0).getAsJsonObject().get("value").getAsString());
|
||||
// break;
|
||||
// case "https://www.ariadne-infrastructure.eu/property/lon":
|
||||
// agp.setLon(stringJsonElementEntry.getValue().getAsJsonArray().get(0).getAsJsonObject().get("value").getAsString());
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// return agp;
|
||||
// }
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
package eu.dnetlib.ariadneplus.elasticsearch.model;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
|
||||
public class AriadneGeoShape {
|
||||
private float lat;
|
||||
private float lon;
|
||||
|
||||
public float getLat() {
|
||||
return lat;
|
||||
}
|
||||
|
||||
public void setLat(float lat) {
|
||||
this.lat = lat;
|
||||
}
|
||||
|
||||
public float getLon() {
|
||||
return lon;
|
||||
}
|
||||
|
||||
public void setLon(float lon) {
|
||||
this.lon = lon;
|
||||
}
|
||||
|
||||
public AriadneGeoShape() {
|
||||
}
|
||||
|
||||
public static AriadneGeoShape fromJson (String json){
|
||||
return new Gson().fromJson(json, AriadneGeoShape.class);
|
||||
}
|
||||
|
||||
// public static AriadneGeoPoint fromRDFJson(JsonElement json){
|
||||
// AriadneGeoPoint agp = new AriadneGeoPoint();
|
||||
// for (Map.Entry<String, JsonElement> stringJsonElementEntry : json.getAsJsonObject().entrySet()) {
|
||||
// switch (stringJsonElementEntry.getKey()){
|
||||
// case "https://www.ariadne-infrastructure.eu/property/lat":
|
||||
// agp.setLat(stringJsonElementEntry.getValue().getAsJsonArray().get(0).getAsJsonObject().get("value").getAsString());
|
||||
// break;
|
||||
// case "https://www.ariadne-infrastructure.eu/property/lon":
|
||||
// agp.setLon(stringJsonElementEntry.getValue().getAsJsonArray().get(0).getAsJsonObject().get("value").getAsString());
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// return agp;
|
||||
// }
|
||||
}
|
|
@ -31,7 +31,7 @@ public class AriadnePlusEntry {
|
|||
private List<Spatial> spatial;
|
||||
private List<Temporal> temporal;
|
||||
private String title;
|
||||
private NativePeriod nativePeriod;
|
||||
private List<NativePeriod> nativePeriod;
|
||||
private String wasCreated;
|
||||
private DigitalImage digitalImage;
|
||||
|
||||
|
@ -268,14 +268,6 @@ public class AriadnePlusEntry {
|
|||
this.ariadneSubject = ariadneSubject;
|
||||
}
|
||||
|
||||
public NativePeriod getNativePeriod() {
|
||||
return nativePeriod;
|
||||
}
|
||||
|
||||
public void setNativePeriod(NativePeriod nativePeriod) {
|
||||
this.nativePeriod = nativePeriod;
|
||||
}
|
||||
|
||||
public DigitalImage getDigitalImage() {
|
||||
return digitalImage;
|
||||
}
|
||||
|
@ -284,6 +276,14 @@ public class AriadnePlusEntry {
|
|||
this.digitalImage = digitalImage;
|
||||
}
|
||||
|
||||
public List<NativePeriod> getNativePeriod() {
|
||||
return nativePeriod;
|
||||
}
|
||||
|
||||
public void setNativePeriod(List<NativePeriod> nativePeriod) {
|
||||
this.nativePeriod = nativePeriod;
|
||||
}
|
||||
|
||||
public String toJson(){
|
||||
return new Gson().toJson(this);
|
||||
}
|
||||
|
|
|
@ -9,8 +9,8 @@ public class Spatial {
|
|||
private String placeName;
|
||||
private String address;
|
||||
private GeoPoint geopoint;
|
||||
private GeoShape boundingbox;
|
||||
private GeoShape polygon;
|
||||
private String boundingbox;
|
||||
private String polygon;
|
||||
private String spatialPrecision;
|
||||
|
||||
private transient String coordinatePrecision;
|
||||
|
@ -69,22 +69,6 @@ public class Spatial {
|
|||
this.placeName = placeName;
|
||||
}
|
||||
|
||||
public GeoShape getBoundingbox() {
|
||||
return boundingbox;
|
||||
}
|
||||
|
||||
public void setBoundingbox(GeoShape boundingbox) {
|
||||
this.boundingbox = boundingbox;
|
||||
}
|
||||
|
||||
public GeoShape getPolygon() {
|
||||
return polygon;
|
||||
}
|
||||
|
||||
public void setPolygon(GeoShape polygon) {
|
||||
this.polygon = polygon;
|
||||
}
|
||||
|
||||
public String getSpatialPrecision() {
|
||||
return spatialPrecision;
|
||||
}
|
||||
|
@ -117,10 +101,26 @@ public class Spatial {
|
|||
this.lon = lon;
|
||||
}
|
||||
|
||||
public String getBoundingbox() {
|
||||
return boundingbox;
|
||||
}
|
||||
|
||||
public void setBoundingbox(String boundingbox) {
|
||||
this.boundingbox = boundingbox;
|
||||
}
|
||||
|
||||
public GeoPoint getGeopoint() {
|
||||
return geopoint;
|
||||
}
|
||||
|
||||
public String getPolygon() {
|
||||
return polygon;
|
||||
}
|
||||
|
||||
public void setPolygon(String polygon) {
|
||||
this.polygon = polygon;
|
||||
}
|
||||
|
||||
public void setGeopoint(GeoPoint geopoint) {
|
||||
this.geopoint = geopoint;
|
||||
}
|
||||
|
|
|
@ -10,7 +10,6 @@ public class Temporal {
|
|||
private String periodName;
|
||||
private String until;
|
||||
private String uri;
|
||||
private transient String matchingPeriodOName;
|
||||
|
||||
public String getFrom() {
|
||||
return from;
|
||||
|
@ -50,12 +49,4 @@ public class Temporal {
|
|||
public static Temporal fromJson(String json){
|
||||
return new Gson().fromJson(json, Temporal.class);
|
||||
}
|
||||
|
||||
public String getMatchingPeriodOName() {
|
||||
return matchingPeriodOName;
|
||||
}
|
||||
|
||||
public void setMatchingPeriodOName(String matchingPeriodOName) {
|
||||
this.matchingPeriodOName = matchingPeriodOName;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ CONSTRUCT {
|
|||
?temporal aoprop:from ?temporalFrom .
|
||||
?temporal aoprop:until ?temporalUntil .
|
||||
?temporal aoprop:uri ?temporal .
|
||||
%record aoprop:temporal ?temporalNative .
|
||||
%record aoprop:temporalNative ?temporalNative .
|
||||
?temporalNative aoprop:nativePeriodName ?temporalNativePeriodName .
|
||||
?temporalNative aoprop:from ?temporalNativeFrom .
|
||||
?temporalNative aoprop:until ?temporalNativeUntil .
|
||||
|
|
|
@ -47,7 +47,7 @@ CONSTRUCT {
|
|||
?temporal aoprop:from ?temporalFrom .
|
||||
?temporal aoprop:until ?temporalUntil .
|
||||
?temporal aoprop:uri ?temporal .
|
||||
%record aoprop:temporal ?temporalNative .
|
||||
%record aoprop:temporalNative ?temporalNative .
|
||||
?temporalNative aoprop:nativePeriodName ?temporalNativePeriodName .
|
||||
?temporalNative aoprop:from ?temporalNativeFrom .
|
||||
?temporalNative aoprop:until ?temporalNativeUntil .
|
||||
|
|
|
@ -131,7 +131,7 @@ public class GraphDbReaderAndESIndexTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
// @Ignore
|
||||
public void uploadADSArchivesBoundingBoxTest() throws Exception {
|
||||
boolean isRecord = true;
|
||||
String recordId = "https://ariadne-infrastructure.eu/aocat/Resource/90D1C95D-E249-3E74-92D9-B58FDF690CC7";
|
||||
|
|
Loading…
Reference in New Issue