Más

Crear shapefile basado en datos geojson con geotools (Java)

Crear shapefile basado en datos geojson con geotools (Java)


Estoy usando Geotools 14.0 para Java y estoy tratando de generar shapefile basado en datos de GeoJSON. Aquí está mi código:

intente {String url = "geojson.json"; Archivo geojson = nuevo archivo (url); Archivo shpFile = nuevo archivo ("test.shp"); ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory (); Mapa params = new HashMap(); params.put ("url", shpFile.toURI (). toURL ()); params.put ("crear índice espacial", booleano.TRUE); ShapefileDataStore shpDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore (params); InputStream en = nuevo FileInputStream (geojson); int decimales = 15; GeometryJSON gjson = new GeometryJSON (decimales); FeatureJSON fjson = new FeatureJSON (gjson); FeatureCollection fc = fjson.readFeatureCollection (en); Tipo de característica simple = (Tipo de característica simple) fc.getSchema (); shpDataStore.createSchema (tipo); Transacción transacción = new DefaultTransaction ("crear"); String typeName = shpDataStore.getTypeNames () [0]; FeatureSource SimpleFeatureSource = shpDataStore.getFeatureSource (typeName); if (featureSource instancia de FeatureStore) {SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource; featureStore.setTransaction (transacción); pruebe {featureStore.addFeatures (fc); para (Objeto c: featureStore.getFeatures (). toArray ()) {System.out.println ("C:" + ((SimpleFeatureImpl) c) .toString ()); } transaction.commit (); } captura (Excepción ex) {ex.printStackTrace (); transaccion.rollback (); } finalmente {transacción.close (); }} else {System.out.println (typeName + "no admite acceso de lectura / escritura"); }} catch (Exception e) {return "Exception" + e.getLocalizedMessage (); }

Y después de esto, obtengo el archivo test.shp pero no contiene ningún dato de geometría. Si lo convierto de nuevo a geojson, obtengo esto:

{"type": "Feature", "properties": {}, "id": "test.1"}

Y este es mi archivo geojson original (geojson.json):

{"type": "FeatureCollection", "features": [{"properties": {"version": 0}, "id": "1", "type": "Feature", "geometry": {"type ":" Polígono "," coordenadas ": [[[1868732.467515988, 6594375.3042187244], [1868732.467515988, 5165920.1196253505], [3297187.6521093622, 5165920.1196253505], [3297187.67515884], [3297187.67515884], [3297187.675543]

¿Hay alguna forma de hacer esto de manera adecuada?


Respuesta corta: su tipo de función no coincide con el estándar Shapefile, por lo que GeoTools elimina los bits ilegales. Tengo una clase de utilidad para solucionar este problema.

intente {String url = "geojson.json"; Archivo geojson = nuevo archivo (url); Archivo shpFile = nuevo archivo ("test.shp"); ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory (); Mapa params = new HashMap(); params.put ("url", shpFile.toURI (). toURL ()); params.put ("crear índice espacial", booleano.TRUE); / * * ShapefileDataStore shpDataStore = (ShapefileDataStore) * dataStoreFactory.createNewDataStore (params); * / InputStream en = nuevo FileInputStream (geojson); int decimales = 15; GeometryJSON gjson = new GeometryJSON (decimales); FeatureJSON fjson = new FeatureJSON (gjson); FeatureCollection fc = fjson.readFeatureCollection (en); fc.getSchema (); Writer WriteShapefile = nuevo WriteShapefile (shpFile); Writer.writeFeatures (fc); } captura (Excepción e) {e.printStackTrace (); // devuelve "Excepción" + e.getLocalizedMessage (); }

Respuesta larga: ¡Shapefiles apesta como formato! El primer atributo de cada entidad debe ser la geometría y debe llamarsethe_geom(de ahí mi sugerencia anterior de cambiar el nombre de su atributo de geometría). Como los tipos de entidades son inmutables en GeoTools, es necesario recorrer los atributos y cambiar el nombre de la geometría y luego moverla al primer lugar mientras se crea un nuevo esquema. DataUtilities.retype reordenará los atributos para que coincidan con el nuevo esquema, pero como la geometría ha cambiado de nombre, debe copiarlos usted mismo. Entonces puede escribir el shapefile como de costumbre.


Ver el vídeo: Cómo CREAR SHAPEFILE PUNTO - LÍNEA - POLÍGONO en ArcGIS #03