this is my function for
conversion from java Object to SimpleFeature
package ru.netris.gps.geo;
import lombok.extern.slf4j.Slf4j;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.util.SimpleInternationalString;
import org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import ru.netris.gps.model.Azimuth;
import ru.netris.gps.model.Latitude;
import ru.netris.gps.model.Longitude;
import ru.netris.gps.model.events.BasicEvent;
import ru.netris.gps.model.events.GeoEvent;
import ru.netris.gps.model.events.VsvnEvent;
@Slf4j
public final class SimpleFeatureUtils {
public static SimpleFeatureType TYPE = createFeatureType();
public static GeometryFactory GEOMETRY_FACTORY = JTSFactoryFinder.getGeometryFactory();
public static SimpleFeature toSimpleFeature(GeoEvent event) {
log.info("save event {}", event);
long time =
event.getTime() > (long) Integer.MAX_VALUE ? event.getTime() : event.getTime() * 1000L;
String EventID = event.getCam() + "-" + time /*event.time*/;
// if altitude > 0, add altitude to coordinate ?
Point point = GEOMETRY_FACTORY.createPoint(
new Coordinate(event.getLon().getValue(), event.getLat().getValue())); // Point(X, Y)
SimpleFeature f = new SimpleFeatureBuilder(TYPE).buildFeature(EventID); // SimpleFeature
f.setAttribute("geo", point);
f.setAttribute("time", new java.util.Date(time)); // (event.time));
f.setAttribute("cam", event.getCam());
f.setAttribute("imei", event.getImei());
f.setAttribute("dir", event.getDir());
f.setAttribute("alt", event.getAlt());
f.setAttribute("vlc", event.getVlc());
f.setAttribute("sl", event.getSl());
f.setAttribute("ds", event.getDs().toInt());
f.setAttribute("dir_y", event instanceof VsvnEvent ? ((VsvnEvent) event).getDirV() : null);
f.setAttribute("poi_azimuth_x",
event instanceof VsvnEvent ? ((VsvnEvent) event).getPoi() : null);
f.setAttribute("poi_azimuth_y",
event instanceof VsvnEvent ? ((VsvnEvent) event).getPoiV() : null);
// log.info("SimpleFeature: " + f);
return f;
}
public static BasicEvent toBasicEvent(SimpleFeature sf) {
Point pt = (Point) sf.getAttribute("geo");
return new BasicEvent(
(String) sf.getAttribute("cam"), // camId
((java.util.Date) sf.getAttribute("time")).getTime(), // dateTime
new Latitude(pt.getY()), // lat (Y)
new Longitude(pt.getX()) // lon (X)
);
}
public static SimpleFeatureType createFeatureType() {
SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder(); // SimpleFeatureTypeBuilder
builder.setName("SignalBuilder");
builder.setCRS(DefaultGeographicCRS.WGS84); // <- Coordinate reference system
builder.setDescription(new SimpleInternationalString("GPS event type"));
// index attributes
builder.setDefaultGeometry("geo");
builder.add("geo", Point.class);
builder.add("time", java.util.Date.class); // date/time
// user attributes
builder.add("cam", java.lang.String.class); // String (!) UUID camId
builder.add("imei", java.lang.String.class); // String IMEI
builder.add("dir", java.lang.Double.class); // direction
builder.add("alt", java.lang.Double.class); // altitude
builder.add("vlc", java.lang.Double.class); // velocity
// extra
builder.add("sl", java.lang.Integer.class); // signal level
builder.add("ds", java.lang.Integer.class); // data status
builder.add("dir_y", java.lang.Double.class); // directionY
builder.add("poi_azimuth_x", java.lang.Double.class); // camera poi x (направление камеры)
builder.add("poi_azimuth_y", java.lang.Double.class); // camera poi y (направление камеры)
return SimpleFeatureTypes.immutable(makeSFT(builder), null);
}
// build the type
private static SimpleFeatureType makeSFT(SimpleFeatureTypeBuilder builder) {
SimpleFeatureType sft = builder.buildFeatureType();
sft.getUserData().put("geomesa.feature.expiry",
"time(30 days)"); // Age-off filter by "time" field
sft.getUserData().put("geomesa.indices.enabled", "z3,z2,attr:time,attr:cam:time");
sft.getUserData().put("geomesa.z3.interval", "week");
sft.getUserData().put("geomesa.table.partition", "time");
sft.getUserData().put("geomesa.index.dtg", "time");
sft.getUserData().put("geomesa.z.splits", "4");
sft.getUserData().put("geomesa.attr.splits", "4");
sft.getDescriptor("cam").getUserData().put("index", "true");
sft.getDescriptor("time").getUserData().put("index", "true");
sft.getDescriptor("geo").getUserData().put("index", "true");
sft.getDescriptor("cam").getUserData().put("keep-stats", "true");
return sft;
}
}