2017-04-27 5 views
1

Ich versuche GeoTools zu verwenden, um ein Shapefile in Java zu laden und dann zu überprüfen, ob ein Punkt innerhalb eines der Polygone in der Formdatei liegt Das Problem ist, dass ich nicht in der Lage bin um das Shapefile zu laden und damit weiter zu machen. Hier ist mein Code so weit:Laden von Shapefile mit GeoTools

public static void main(String[] args){ 
    // create sample coordinate 
    double lon = -105.0; 
    double lat = 40.0; 
    GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(PrecisionModel.maximumPreciseValue),8307); 
    Geometry point = geometryFactory.createPoint(new Coordinate(lon,lat)); 
    // 

    String path = System.getProperty("user.dir") + "/continent_shp/continent_shp.shp"; 
    File file = new File(path); 

    try { 
     Map<String, Serializable> connectParameters = new HashMap<String, Serializable>(); 

     // load shapefile ---- does not work !!!!!!!! 
     connectParameters.put("url", file.toURI().toURL()); 
     connectParameters.put("create spatial index", true); 
     DataStore dataStore = DataStoreFinder.getDataStore(connectParameters); 
     // 

     FeatureSource featureSource = dataStore.getFeatureSource("POLYGON"); 
     FeatureCollection collection = (FeatureCollection) featureSource.getFeatures(); 
     FeatureIterator iterator = collection.features(); 

     while (iterator.hasNext()) { 
      Feature feature = iterator.next(); 
      Geometry sourceGeometry = feature.getDefaultGeometry(); 
      boolean isContained = sourceGeometry.contains(point); 
      System.out.println(isContained); 
     } 
    } 
    catch (MalformedURLException e) {e.printStackTrace();} 
    catch (IOException e) {e.printStackTrace();} 
} 

Das Problem ist, dass die dataStore Variable null ist, nachdem ich versuche, die Shape-Datei zu laden.

Hier sind meine Importe:

import java.io.File; 
import java.io.IOException; 
import java.io.Serializable; 
import java.net.MalformedURLException; 
import java.util.HashMap; 
import java.util.Map; 

import org.geotools.data.DataStore; 
import org.geotools.data.DataStoreFinder; 
import org.geotools.data.FeatureSource; 
import org.geotools.feature.Feature; 
import org.geotools.feature.FeatureCollection; 
import org.geotools.feature.FeatureIterator; 

import com.vividsolutions.jts.geom.Coordinate; 
import com.vividsolutions.jts.geom.Geometry; 
import com.vividsolutions.jts.geom.GeometryFactory; 
import com.vividsolutions.jts.geom.PrecisionModel; 

Kann jemand etwas Licht ins Dunkel bringen? Jede Hilfe wäre willkommen. Danke.

+0

haben Sie gt-Shape-Datei in Ihrer Projektabhängigkeit enthalten? –

Antwort

0

Das wahrscheinlichste Problem ist, dass Sie keine Shapefile Datastore-Implementierung auf Ihrem Pfad verfügbar haben. Versuchen Sie, die folgende Methode, um zu überprüfen, was Handel erhältlich sind:

public Map<String, DataStoreFactorySpi> fetchAvailableDataStores() { 

     Iterator<DataStoreFactorySpi> it = DataStoreFinder.getAllDataStores(); 
     while (it.hasNext()) { 
     DataStoreFactorySpi fac = it.next(); 
     System.out.println(fac.getDisplayName()); 
     } 
    } 

Eine andere Sache, die schief gehen können Sie die Datei auf URL Konvertierung ist, vor allem wenn es Leerzeichen im Dateinamen oder Pfad. Verwenden Sie stattdessen DataUtilities.fileToURL(file).

0

für mich Dies funktionierte:

// load shapefile ---- does not work !!!!!!!! 
    connectParameters.put("url", file.toURI().toURL()); 
    connectParameters.put("create spatial index", Boolean.TRUE); 
    ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory(); 
    ShapefileDataStore store = (ShapefileDataStore) dataStoreFactory.createNewDataStore(connectParameters); 
    // 
Verwandte Themen