use of org.geotoolkit.internal.geojson.binding.GeoJSONFeatureCollection in project geotoolkit by Geomatys.
the class GeoJSONReader method read.
private void read() throws BackingStoreException {
if (current != null)
return;
// first call
if (toRead) {
rwlock.readLock().lock();
try {
jsonObj = GeoJSONParser.parse(jsonFile, true);
} catch (IOException e) {
throw new BackingStoreException(e);
} finally {
toRead = false;
rwlock.readLock().unlock();
}
}
if (jsonObj instanceof GeoJSONFeatureCollection) {
final GeoJSONFeatureCollection fc = (GeoJSONFeatureCollection) jsonObj;
rwlock.readLock().lock();
try {
if (fc.hasNext()) {
current = toFeature(fc.next());
}
} finally {
rwlock.readLock().unlock();
}
} else if (jsonObj instanceof GeoJSONFeature) {
current = toFeature((GeoJSONFeature) jsonObj);
jsonObj = null;
} else if (jsonObj instanceof GeoJSONGeometry) {
current = toFeature((GeoJSONGeometry) jsonObj);
jsonObj = null;
}
}
use of org.geotoolkit.internal.geojson.binding.GeoJSONFeatureCollection in project geotoolkit by Geomatys.
the class GeoJSONReader method fillFeature.
/**
* Recursively fill a ComplexAttribute with properties map
*
* @param feature
* @param properties
*/
private void fillFeature(Feature feature, Map<String, Object> properties) throws BackingStoreException {
final FeatureType featureType = feature.getType();
for (final PropertyType type : featureType.getProperties(true)) {
final String attName = type.getName().toString();
final Object value = properties.get(attName);
if (value == null) {
continue;
}
if (type instanceof FeatureAssociationRole) {
final FeatureAssociationRole asso = (FeatureAssociationRole) type;
final FeatureType assoType = asso.getValueType();
final Class<?> valueClass = value.getClass();
if (valueClass.isArray()) {
Class<?> base = value.getClass().getComponentType();
if (!Map.class.isAssignableFrom(base)) {
LOGGER.log(Level.WARNING, "Invalid complex property value " + value);
}
final int size = Array.getLength(value);
if (size > 0) {
// list of objects
final List<Feature> subs = new ArrayList<>();
for (int i = 0; i < size; i++) {
Object subValue = Array.get(value, i);
final Feature subComplexAttribute;
if (subValue instanceof Map) {
subComplexAttribute = assoType.newInstance();
fillFeature(subComplexAttribute, (Map) Array.get(value, i));
} else if (subValue instanceof GeoJSONFeature) {
subComplexAttribute = toFeature((GeoJSONFeature) subValue, assoType);
} else {
throw new IllegalArgumentException("Sub value must be a GeoJSONFeature or a map");
}
subs.add(subComplexAttribute);
}
feature.setPropertyValue(attName, subs);
}
} else if (value instanceof Map) {
final Feature subComplexAttribute = assoType.newInstance();
fillFeature(subComplexAttribute, (Map) value);
feature.setPropertyValue(attName, subComplexAttribute);
} else if (value instanceof GeoJSONFeature) {
final Feature subComplexAttribute = toFeature((GeoJSONFeature) value, assoType);
feature.setPropertyValue(attName, subComplexAttribute);
} else if (value instanceof GeoJSONFeatureCollection) {
GeoJSONFeatureCollection collection = (GeoJSONFeatureCollection) value;
final List<Feature> subFeatures = new ArrayList<>();
for (GeoJSONFeature subFeature : collection.getFeatures()) {
subFeatures.add(toFeature(subFeature, assoType));
}
feature.setPropertyValue(attName, subFeatures);
} else {
LOGGER.warning("Unexpected attribute value type:" + value.getClass());
}
} else if (type instanceof AttributeType) {
final Attribute<?> property = (Attribute<?>) feature.getProperty(type.getName().toString());
fillProperty(property, value);
}
}
}
use of org.geotoolkit.internal.geojson.binding.GeoJSONFeatureCollection in project geotoolkit by Geomatys.
the class GeoJSONStore method readType.
/**
* Read FeatureType from a JSON-Schema file if exist or directly from the
* input JSON file.
*
* @return
* @throws DataStoreException
* @throws IOException
*/
private FeatureType readType() throws DataStoreException, IOException {
if (Files.exists(descFile) && Files.size(descFile) != 0) {
// build FeatureType from description JSON.
return FeatureTypeUtils.readFeatureType(descFile);
} else {
if (Files.exists(jsonFile) && Files.size(jsonFile) != 0) {
final String name = GeoJSONUtils.getNameWithoutExt(jsonFile);
final FeatureTypeBuilder ftb = new FeatureTypeBuilder();
ftb.setName(name);
// build FeatureType from the first Feature of JSON file.
final GeoJSONObject obj = GeoJSONParser.parse(jsonFile, true);
if (obj == null) {
throw new DataStoreException("Invalid GeoJSON file " + jsonFile.toString());
}
CoordinateReferenceSystem crs = GeoJSONUtils.getCRS(obj);
if (obj instanceof GeoJSONFeatureCollection) {
GeoJSONFeatureCollection jsonFeatureCollection = (GeoJSONFeatureCollection) obj;
if (!jsonFeatureCollection.hasNext()) {
// empty FeatureCollection error ?
throw new DataStoreException("Empty GeoJSON FeatureCollection " + jsonFile.toString());
} else {
// TODO should we analyse all Features from FeatureCollection to be sure
// that each Feature properties JSON object define exactly the same properties
// with the same bindings ?
GeoJSONFeature jsonFeature = jsonFeatureCollection.next();
fillTypeFromFeature(ftb, crs, jsonFeature, false);
}
} else if (obj instanceof GeoJSONFeature) {
GeoJSONFeature jsonFeature = (GeoJSONFeature) obj;
fillTypeFromFeature(ftb, crs, jsonFeature, true);
} else if (obj instanceof GeoJSONGeometry) {
ftb.addAttribute(String.class).setName("fid").addRole(AttributeRole.IDENTIFIER_COMPONENT);
ftb.addAttribute(findBinding((GeoJSONGeometry) obj)).setName("geometry").setCRS(crs).addRole(AttributeRole.DEFAULT_GEOMETRY);
}
return ftb.build();
} else {
throw new DataStoreException("Can't create FeatureType from empty/not found Json file " + jsonFile.getFileName().toString());
}
}
}
use of org.geotoolkit.internal.geojson.binding.GeoJSONFeatureCollection in project geotoolkit by Geomatys.
the class GeoJSONReadTest method parserTest.
/**
* Test GeoJSONParser full and lazy reading on FeatureCollection
*/
@Test
public void parserTest() throws URISyntaxException, IOException {
URL fcFile = GeoJSONReadTest.class.getResource("/org/apache/sis/internal/storage/geojson/featurecollection.json");
Path fcPath = Paths.get(fcFile.toURI());
// test with full reading
GeoJSONObject geoJSONObject = GeoJSONParser.parse(fcPath, false);
assertTrue(geoJSONObject instanceof GeoJSONFeatureCollection);
GeoJSONFeatureCollection geojsonFC = (GeoJSONFeatureCollection) geoJSONObject;
assertFalse(geojsonFC.isLazyMode());
assertEquals(7, geojsonFC.getFeatures().size());
for (int i = 0; i < 7; i++) {
assertTrue(geojsonFC.hasNext());
assertNotNull(geojsonFC.next());
}
// end of collection
assertFalse(geojsonFC.hasNext());
// test in lazy reading
geoJSONObject = GeoJSONParser.parse(fcPath, true);
assertTrue(geoJSONObject instanceof GeoJSONFeatureCollection);
geojsonFC = (GeoJSONFeatureCollection) geoJSONObject;
assertTrue(geojsonFC.isLazyMode());
// lazy don't know number of features
assertEquals(0, geojsonFC.getFeatures().size());
for (int i = 0; i < 7; i++) {
assertTrue(geojsonFC.hasNext());
assertNotNull(geojsonFC.next());
}
// end of collection
assertFalse(geojsonFC.hasNext());
}
Aggregations