1

I would like to import shapefiles to PostGIS. the method I used to work with takes as argument the path of the shapefile ( a string ) , but since I need to link this to my frontend , I can only work with files as there is no way to retrieve the path of a file selected by the user ( c:/fakepath problem ). I've searched and found that when working with the file we use the code below , but the problem is I get the error of DataStore is null !!! , I've tried to add the other files .dbf and .shx that are mandatory but still get the error below ?


   
   
   public shptoPostgis (File  shapefile,String b) throws  NoSuchAuthorityCodeException, FactoryException, MalformedURLException, IOException, ClassNotFoundException, SQLException {
   
   
   String postGISTblName = b;//name to give to the newly created table 
   String shapeEPSG = "EPSG:4326";//the epsg to use if not found from shpefile
       try {//

           Map shapeParams = new HashMap();
           shapeParams.put("file", shapefile);
         
           
        shapeParams.put( "charset", "ISO-8859-7" );//for greek chars
          DataStore shapeDataStore = DataStoreFinder.getDataStore(shapeParams);
           
       
           // feature type
           String typeName = shapeDataStore.getTypeNames()[0];
           FeatureSource<SimpleFeatureType,SimpleFeature> featSource = shapeDataStore.getFeatureSource(typeName);
           FeatureCollection<SimpleFeatureType,SimpleFeature> featSrcCollection = featSource.getFeatures();
           SimpleFeatureType ft = shapeDataStore.getSchema(typeName);
           // feature type copy to set the new name
           SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
           builder.setName(postGISTblName);
           builder.setAttributes(ft.getAttributeDescriptors());
           builder.setCRS(ft.getCoordinateReferenceSystem());

           SimpleFeatureType newSchema = builder.buildFeatureType();

           // management of the projection system
           CoordinateReferenceSystem crs = ft.getCoordinateReferenceSystem();

           // test of the CRS based on the .prj file
           Integer crsCode = CRS.lookupEpsgCode(crs, true);

           Set<ReferenceIdentifier> refIds = ft.getCoordinateReferenceSystem().getIdentifiers();
           if ( ( (refIds == null) || (refIds.isEmpty() ) ) && (crsCode == null) ) {
               CoordinateReferenceSystem crsEpsg = CRS.decode(shapeEPSG);
               newSchema = SimpleFeatureTypeBuilder.retype(newSchema,crsEpsg);
           }

           
           
           Map postGISParams = new HashMap<String,Object>();
           postGISParams.put("dbtype", "postgis");         //must be postgis
           postGISParams.put("host", "localhost");         //the name or ip address of the machine running PostGIS
           postGISParams.put("port",5433);                 //the port that PostGIS is running on (generally 5432)
           postGISParams.put("database", "DB");       //the name of the database to connect to.
           postGISParams.put("user", "postgres");          //the user to connect with
           postGISParams.put("passwd", "goblin");    //the password of the user.
           postGISParams.put("schema", "public");        //the schema of the database
           postGISParams.put("create spatial index", Boolean.TRUE);
           DataStore dataStore = null;
           try {
           // storage in PostGIS
           dataStore = DataStoreFinder.getDataStore(postGISParams);
           } catch (Exception e){
           System.out.println("problem with datastore:"+e);
           }
          
           if (dataStore == null) {
            System.out.println("ERROR:dataStore is null");
           } 
           
           dataStore.createSchema(newSchema);
           @SuppressWarnings("unchecked")
           FeatureStore<SimpleFeatureType,SimpleFeature> featStore = (FeatureStore<SimpleFeatureType,SimpleFeature>)dataStore.getFeatureSource(postGISTblName);
       
           featStore.addFeatures(featSrcCollection);
          

       } catch (IOException e) {
           System.out.println("ERROR:"+e);
       }

      System.out.println("Shapefile imported successfully !!!!!");

}






the error :

java.lang.NullPointerException: Cannot invoke "org.geotools.data.DataStore.getTypeNames()" because "shapeDataStore" is null
    at com.example.demo.model.test.<init>(test.java:57) ~[classes/:na]
    at com.example.demo.controller.geoserverController.ImportshapefiletoDB(geoserverController.java:90) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.15.jar:5.3.15]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.15.jar:5.3.15]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.15.jar:5.3.15]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.15.jar:5.3.15]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.15.jar:5.3.15]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.15.jar:5.3.15]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.15.jar:5.3.15]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.15.jar:5.3.15]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.15.jar:5.3.15]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.15.jar:5.3.15]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) ~[tomcat-embed-core-9.0.56.jar:4.0.FR]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.15.jar:5.3.15]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.56.jar:4.0.FR]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.56.jar:9.0.56]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.15.jar:5.3.15]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar:5.3.15]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.15.jar:5.3.15]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar:5.3.15]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.15.jar:5.3.15]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar:5.3.15]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
    at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]



1 Answer 1

0

The easy way to open a Shapefile is to use something like:

ShapefileDataStore ds = new ShapefileDataStore(URLs.fileToUrl(states));

Or if you want to go through the datastore finder something like:

DataStore inputDataStore = DataStoreFinder.getDataStore(
        Collections.singletonMap(ShapefileDataStoreFactory.URLP.key,
        URLs.fileToUrl(inFile)));

The reason your code is not working is because ShapefileDataStoreFactory doesn't have a file parameter. You can find the available parameter keys in the documentation or programatically:

ShapefileDataStoreFactory sf = new ShapefileDataStoreFactory();
for (Param p : sf.getParametersInfo()) {
  System.out.println(p.key + "\t" + p.description);
}

which gives:

url url to a .shp file
namespace   uri to a the namespace
enable spatial index    enable/disable the use of spatial index for local shapefiles
create spatial index    enable/disable the automatic creation of spatial index
charset character used to decode strings from the DBF file
timezone    time zone used to read dates from the DBF file
memory mapped buffer    enable/disable the use of memory-mapped io
cache and reuse memory maps only memory map a file one, then cache and reuse the map
filetype    Discriminator for directory stores
fstype  Enable using a setting of 'shape'.
skipScan    Skip scan for alternative shapefile extensions (i.e. .SHP, .shp.XML, ...)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.