package org.openstreetmap.josm.plugins.osminspector; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.ProgressMonitor; import org.geotools.data.DataStore; import org.geotools.data.DataStoreFinder; import org.geotools.data.FeatureSource; import org.geotools.factory.CommonFactoryFinder; import org.geotools.factory.GeoTools; import org.geotools.feature.FeatureCollection; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.CRS; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.AttributeDescriptor; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory2; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.Bounds; import org.openstreetmap.josm.data.coor.LatLon; public class GeoFabrikWFSClient { //private Bounds bbox; private DataStore data; private boolean bInitialized = false; public GeoFabrikWFSClient(Bounds bounds) { //bbox = bounds; } public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatures( String typeName, ProgressMonitor progressMonitor) throws IOException, NoSuchAuthorityCodeException, FactoryException { initializeDataStore(); // Step 3 - discovery; enhance to iterate over all types with bounds SimpleFeatureType schema = data.getSchema(typeName); progressMonitor.setProgress(30); // Step 4 - target FeatureSource<SimpleFeatureType, SimpleFeature> source = data .getFeatureSource(typeName); Main.info("Source Metadata Bounds:" + source.getBounds()); Main.info("Source schema: " + source.getSchema()); progressMonitor.setProgress(40); // Step 5 - query List<AttributeDescriptor> listAttrs = schema.getAttributeDescriptors(); String geomName = listAttrs.get(0).getLocalName(); CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4236"); Bounds bounds = Main.map.mapView.getLatLonBounds(Main.map.mapView .getBounds()); LatLon minLL = bounds.getMin(); LatLon maxLL = bounds.getMax(); double minLat = Math.min(minLL.getY(), maxLL.getY()); double maxLat = Math.max(minLL.getY(), maxLL.getY()); double minLon = Math.min(minLL.getX(), maxLL.getX()); double maxLon = Math.max(minLL.getX(), maxLL.getX()); ReferencedEnvelope bboxRef = new ReferencedEnvelope(minLon, maxLon, minLat, maxLat, targetCRS); Main.info("Reference Bounds:" + bboxRef); progressMonitor.setProgress(50); // // Ask WFS service for typeName data constrained by bboxRef // FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(GeoTools .getDefaultHints()); Filter filterBB = ff.bbox(ff.property(geomName), bboxRef); FeatureCollection<SimpleFeatureType, SimpleFeature> features = source .getFeatures(filterBB); progressMonitor.setProgress(80); return features; } public void initializeDataStore() throws IOException { if (bInitialized == true) return; String getCapabilities = "http://tools.geofabrik.de/osmi/view/routing_non_eu/wxs?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetCapabilities"; @SuppressWarnings("rawtypes") Map<String, Comparable> connectionParameters = new HashMap<>(); connectionParameters.put("WFSDataStoreFactory:GET_CAPABILITIES_URL", getCapabilities); connectionParameters.put("WFSDataStoreFactory:WFS_STRATEGY", "mapserver"); connectionParameters.put("WFSDataStoreFactory:LENIENT", true); connectionParameters.put("WFSDataStoreFactory:TIMEOUT", 20000); connectionParameters.put("WFSDataStoreFactory:BUFFER_SIZE", 10000); // Step 2 - connection data = DataStoreFinder.getDataStore(connectionParameters); bInitialized = true; } public String[] getTypeNames() throws IOException { return data.getTypeNames(); } public DataStore getData() { return data; } public void setData(DataStore data) { this.data = data; } /** * @param args */ public static void main(String[] args) { // try { // CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326"); // GeoFabrikWFSClient theTest = new GeoFabrikWFSClient( new // Bounds(-124.0, -120.0, 32.0, 36.0)); // theTest.initializeDataStore(); // FeatureCollection<SimpleFeatureType, SimpleFeature> features = // theTest.getFeatures(); // OsmInspectorLayer inspector = new OsmInspectorLayer( // theTest.getData()); // inspector.setVisible(true); // ReferencedEnvelope bounds = new ReferencedEnvelope(); // Iterator<SimpleFeature> iterator = features.iterator(); // try { // while (iterator.hasNext()) { // Feature feature = iterator.next(); // bounds.include(feature.getBounds()); // } // Main.info("Calculated Bounds:" + bounds); // } finally { // features.close(iterator); // } // } catch (Exception e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } }