GIS field viewer completely integrated in SLC RCP
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 13 Oct 2010 16:47:23 +0000 (16:47 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 13 Oct 2010 16:47:23 +0000 (16:47 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@3842 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

18 files changed:
eclipse/plugins/org.argeo.slc.client.gis/META-INF/MANIFEST.MF
eclipse/plugins/org.argeo.slc.client.gis/META-INF/spring/gisclient-osgi.xml
eclipse/plugins/org.argeo.slc.client.gis/META-INF/spring/gisclient-views.xml
eclipse/plugins/org.argeo.slc.client.gis/src/main/java/org/argeo/slc/client/gis/views/GeoToolsMapView.java
modules/gis/org.argeo.slc.gis.position.backend/META-INF/MANIFEST.MF
modules/gis/org.argeo.slc.gis.position.backend/META-INF/spring/backend-osgi.xml
modules/gis/org.argeo.slc.gis.position.backend/META-INF/spring/backend.xml
runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/AbstractDataDescriptor.java [new file with mode: 0644]
runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/Backend.java [new file with mode: 0644]
runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/DataDescriptor.java [new file with mode: 0644]
runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/FeatureSourceDataDescriptor.java [new file with mode: 0644]
runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/PostgisDataDescriptor.java [new file with mode: 0644]
runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/PostgisLayerDataDescriptor.java [new file with mode: 0644]
runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/VectorDataDescriptor.java [new file with mode: 0644]
runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/WorldImageDataDescriptor.java [new file with mode: 0644]
runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/swing/GisFieldViewer.java
runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/swing/VersatileZoomTool.java
runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/gis/field/FieldBackend.java [new file with mode: 0644]

index 5f4b240dff135337c24b24032d95e443092fe203..4fd9fc601b25588490500a9e3d583436dd14dbaf 100644 (file)
@@ -9,8 +9,25 @@ Require-Bundle: org.eclipse.ui,
  org.argeo.dep.osgi.jai.imageio;bundle-version="1.1.0"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: org.argeo.eclipse.spring,
+Import-Package: com.vividsolutions.jts.geom;version="1.10.0",
+ org.apache.commons.logging;version="1.1.1",
+ org.argeo.eclipse.spring,
+ org.argeo.slc.geotools;version="0.13.0.SNAPSHOT-r3817",
+ org.argeo.slc.geotools.data,
  org.argeo.slc.geotools.swing;version="0.13.0.SNAPSHOT-r3817",
+ org.argeo.slc.gis.model;version="0.13.0.SNAPSHOT-r3817",
  org.argeo.slc.jts;version="0.13.0.SNAPSHOT-r3817",
  org.geotools.data,
+ org.geotools.gce.image,
+ org.geotools.geometry,
+ org.geotools.map,
+ org.geotools.renderer,
+ org.geotools.renderer.lite,
+ org.geotools.styling,
+ org.geotools.swing,
+ org.geotools.swing.event,
+ org.geotools.swing.tool,
+ org.opengis.feature.simple,
+ org.opengis.geometry,
+ org.opengis.referencing.crs,
  org.springframework.osgi.util;version="1.2.1"
index 5757bd30b65ced7178785aea37d5a1f6c28a90ea..69235e815fd8c9f7601bb0206d703dd24249b36d 100644 (file)
@@ -7,10 +7,6 @@
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">\r
 \r
        <reference id="positionProvider" interface="org.argeo.slc.jts.PositionProvider" />\r
-       \r
-       <reference id="postGisDataStore" interface="org.geotools.data.DataStore" />\r
-       <!--\r
-<service ref="postGisDataStore" interface="org.geotools.data.DataStore" />\r
-       <bundle id="geotools" symbolic-name="org.argeo.dep.osgi.geotools" />\r
-       <bundle id="jai.imageio" symbolic-name="org.argeo.dep.osgi.jai.imageio" />\r
---></beans:beans>
\ No newline at end of file
+\r
+       <reference id="backend" interface="org.argeo.slc.geotools.Backend" />\r
+</beans:beans>
\ No newline at end of file
index 307115f87e338e149cca365fa1050303b2617579..f395c7b2159b601f45593e210b51aafbf8c03d58 100644 (file)
@@ -1,27 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:osgi="http://www.springframework.org/schema/osgi"
        xsi:schemaLocation="
                http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
-               http://www.springframework.org/schema/osgi  
-               http://www.springframework.org/schema/osgi/spring-osgi-1.1.xsd
        ">
 
        <bean id="org.argeo.slc.client.gis.mapView" class="org.argeo.slc.client.gis.views.GeoToolsMapView"
                scope="prototype">
                <property name="positionProvider" ref="positionProvider" />
-               <property name="postGisDataStore" ref="postGisDataStore" />
-               <property name="jaiImageIoClassLoader" ref="jai.imageio.bdClassLoader" />
+               <property name="backend" ref="backend" />
+               <property name="mapContext" ref="mapContext" />
        </bean>
 
-       <bean id="jai.imageio.bdClassLoader"
-               class="org.springframework.osgi.util.BundleDelegatingClassLoader"
-               factory-method="createBundleClassLoaderFor">
-               <constructor-arg>
-                       <osgi:bundle symbolic-name="org.argeo.dep.osgi.jai.imageio" />
-               </constructor-arg>
-       </bean>
+       <bean id="mapContext" class="org.geotools.map.DefaultMapContext" />
 
 </beans>
index 6a7bd021be0dc6820a8d829806d74799772f0aab..369798706ae70e13d06260a01811244eb6b2ba71 100644 (file)
 package org.argeo.slc.client.gis.views;
 
+import java.awt.Color;
 import java.awt.Frame;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
 
-import org.argeo.slc.geotools.swing.GisFieldViewer;
+import javax.swing.SwingUtilities;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.geotools.Backend;
+import org.argeo.slc.geotools.DataDescriptor;
+import org.argeo.slc.geotools.data.FeatureSourceDataDescriptor;
+import org.argeo.slc.geotools.data.PostgisDataDescriptor;
+import org.argeo.slc.geotools.data.WorldImageDataDescriptor;
+import org.argeo.slc.geotools.swing.VersatileZoomTool;
+import org.argeo.slc.gis.model.FieldPosition;
 import org.argeo.slc.jts.PositionProvider;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.awt.SWT_AWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.part.ViewPart;
-import org.geotools.data.DataStore;
+import org.geotools.geometry.DirectPosition2D;
+import org.geotools.geometry.Envelope2D;
+import org.geotools.map.MapContext;
+import org.geotools.renderer.lite.StreamingRenderer;
+import org.geotools.styling.RasterSymbolizer;
+import org.geotools.styling.Style;
+import org.geotools.styling.StyleBuilder;
+import org.geotools.swing.JMapPane;
+import org.geotools.swing.event.MapPaneAdapter;
+import org.geotools.swing.event.MapPaneEvent;
+
+import com.vividsolutions.jts.geom.Coordinate;
 
 public class GeoToolsMapView extends ViewPart {
        public static final String ID = "org.argeo.slc.client.gis.views.GeoToolsMapView";
+       private final static Log log = LogFactory.getLog(GeoToolsMapView.class);
 
        private Composite embedded;
 
        private PositionProvider positionProvider;
 
-       private DataStore postGisDataStore;
+       private Backend backend;
+
+       private MapContext mapContext;
+       private JMapPane mapPane;
 
-       private ClassLoader jaiImageIoClassLoader;
+       /** in s */
+       private Integer positionRefreshPeriod = 1;
+       private FieldPosition currentPosition = null;
+       private Boolean positionProviderDisconnected = false;
+       private VersatileZoomTool versatileZoomTool;
 
        public void createPartControl(Composite parent) {
                embedded = new Composite(parent, SWT.EMBEDDED | SWT.NO_BACKGROUND);
                Frame frame = SWT_AWT.new_Frame(embedded);
 
-               GisFieldViewer gisFieldViewer = new GisFieldViewer(frame);
-               gisFieldViewer.setPostGisDataStore(postGisDataStore);
-               gisFieldViewer.setPositionProvider(positionProvider);
-               gisFieldViewer.setJaiImageIoClassLoader(jaiImageIoClassLoader);
-               gisFieldViewer.afterPropertiesSet();
+               mapPane = new JMapPane(new StreamingRenderer(), mapContext);
+               versatileZoomTool = new VersatileZoomTool();
+               mapPane.setCursorTool(versatileZoomTool);
+
+               mapPane.addMapPaneListener(new CustomMapPaneListener());
+
+               frame.add(mapPane);
+
+               centerOnPosition();
+
+               for (DataDescriptor dd : backend.getAvailableData(null)) {
+                       if (dd instanceof WorldImageDataDescriptor) {
+                               StyleBuilder styleBuilder = new StyleBuilder();
+                               RasterSymbolizer rs = styleBuilder.createRasterSymbolizer();
+                               rs.setGeometryPropertyName("geom");
+                               Style rasterStyle = styleBuilder.createStyle(rs);
+                               try {
+                                       mapContext.addLayer(backend.loadGridCoverage(dd),
+                                                       rasterStyle);
+                               } catch (Exception e) {
+                                       log.warn(e);
+                               }
+
+                       } else if (dd instanceof FeatureSourceDataDescriptor) {
+                               try {
+                                       mapContext.addLayer(backend.loadFeatureSource(dd), null);
+                               } catch (Exception e) {
+                                       log.warn(e);
+                               }
+                       } else if (dd instanceof PostgisDataDescriptor) {
+                               // DataStore dataStore = backend.loadDataStore(dd);
+                               for (DataDescriptor dd2 : backend.getAvailableData(dd))
+                                       mapContext.addLayer(backend.loadFeatureSource(dd2), null);
+                       }
+               }
+               // GisFieldViewer gisFieldViewer = new GisFieldViewer(frame);
+               // gisFieldViewer.setPostGisDataStore(postGisDataStore);
+               // gisFieldViewer.setPositionProvider(positionProvider);
+               // gisFieldViewer.setJaiImageIoClassLoader(jaiImageIoClassLoader);
+               // gisFieldViewer.afterPropertiesSet();
+
+               new Thread(new PositionUpdater()).start();
+
+       }
+
+       protected void receiveNewPosition(FieldPosition position) {
+               if (position != null && versatileZoomTool != null) {
+                       positionProviderDisconnected = false;
+                       currentPosition = position;
+                       Point2D point2d = new DirectPosition2D(currentPosition
+                                       .getLocation().getCoordinate().x, currentPosition
+                                       .getLocation().getCoordinate().y);
+                       versatileZoomTool.setFieldPosition(point2d);
+                       drawPositionLocation();
+               } else {
+                       positionProviderDisconnected = true;
+               }
+       }
+
+       protected void drawPositionLocation() {
+               SwingUtilities.invokeLater(new Runnable() {
+                       public void run() {
+                               if (currentPosition == null)
+                                       return;
+
+                               AffineTransform tr = getMapPane().getWorldToScreenTransform();
+                               DirectPosition2D geoCoords = new DirectPosition2D(
+                                               currentPosition.getLocation().getCoordinate().x,
+                                               currentPosition.getLocation().getCoordinate().y);
+                               if (tr == null)
+                                       return;
+                               tr.transform(geoCoords, geoCoords);
+                               geoCoords.setCoordinateReferenceSystem(getMapPane()
+                                               .getMapContext().getCoordinateReferenceSystem());
+
+                               final int halfRefSize = 3;
+                               Rectangle rect = new Rectangle((int) Math.round(geoCoords
+                                               .getX() - halfRefSize), (int) Math.round(geoCoords
+                                               .getY() - halfRefSize), halfRefSize * 2 + 1,
+                                               halfRefSize * 2 + 1);
+                               Graphics2D g2D = (Graphics2D) getMapPane().getGraphics();
+                               if (g2D == null)
+                                       return;
+                               g2D.setColor(Color.WHITE);
+                               if (positionProviderDisconnected)
+                                       g2D.setXORMode(Color.ORANGE);
+                               else
+                                       g2D.setXORMode(Color.RED);
+                               g2D.drawRect(rect.x, rect.y, rect.width, rect.height);
+                               g2D.drawRect(rect.x - 1, rect.y - 1, rect.width + 2,
+                                               rect.height + 2);
+                       }
+               });
+       }
+
+       protected void centerOnPosition() {
+               if (currentPosition == null)
+                       return;
+               Envelope2D env = new Envelope2D();
+               final double increment = 1d;
+               Coordinate positionCoo = currentPosition.getLocation().getCoordinate();
+               env.setFrameFromDiagonal(positionCoo.x - increment, positionCoo.y
+                               - increment, positionCoo.x + increment, positionCoo.y
+                               + increment);
+               getMapPane().setDisplayArea(env);
+
        }
 
        public void setFocus() {
@@ -37,16 +172,70 @@ public class GeoToolsMapView extends ViewPart {
                        embedded.setFocus();
        }
 
+       protected JMapPane getMapPane() {
+               return mapPane;
+       }
+
        public void setPositionProvider(PositionProvider positionProvider) {
                this.positionProvider = positionProvider;
        }
 
-       public void setPostGisDataStore(DataStore postGisDataStore) {
-               this.postGisDataStore = postGisDataStore;
+       public void setBackend(Backend backend) {
+               this.backend = backend;
+       }
+
+       public void setMapContext(MapContext mapContext) {
+               this.mapContext = mapContext;
        }
 
-       public void setJaiImageIoClassLoader(ClassLoader jaiImageIoClassLoader) {
-               this.jaiImageIoClassLoader = jaiImageIoClassLoader;
+       private class CustomMapPaneListener extends MapPaneAdapter {
+
+               @Override
+               public void onRenderingStopped(MapPaneEvent ev) {
+                       drawPositionLocation();
+               }
+
+               @Override
+               public void onDisplayAreaChanged(MapPaneEvent ev) {
+                       drawPositionLocation();
+               }
+
+               @Override
+               public void onRenderingProgress(MapPaneEvent ev) {
+                       drawPositionLocation();
+               }
+
+               @Override
+               public void onRenderingStarted(MapPaneEvent ev) {
+                       drawPositionLocation();
+               }
+
+               @Override
+               public void onResized(MapPaneEvent ev) {
+                       drawPositionLocation();
+               }
+
+       }
+
+       private class PositionUpdater implements Runnable {
+
+               public void run() {
+                       while (true) {
+                               FieldPosition currentPosition = positionProvider
+                                               .currentPosition();
+
+                               receiveNewPosition(currentPosition);
+
+                               if (currentPosition != null) {
+                               }
+
+                               try {
+                                       Thread.sleep(positionRefreshPeriod * 1000);
+                               } catch (InterruptedException e) {
+                                       e.printStackTrace();
+                               }
+                       }
+               }
        }
 
 }
\ No newline at end of file
index 861c3e9076110f8af376f5a615fd6a08b0991f05..8b6d4a9aa96d6f31cd9c27e6be62316ba7efdd2e 100644 (file)
@@ -6,7 +6,9 @@ Bundle-Version: 1.0.0.qualifier
 Import-Package: org.apache.commons.dbcp;version="1.2.2.osgi",
  org.argeo.slc.core.deploy;version="0.12.2.SNAPSHOT-r3503",
  org.argeo.slc.geotools;version="0.12.2.SNAPSHOT-r3562",
+ org.argeo.slc.geotools.data,
  org.argeo.slc.geotools.swing;version="0.12.2.SNAPSHOT-r3565",
+ org.argeo.slc.gis.field,
  org.argeo.slc.jts;version="0.12.2.SNAPSHOT-r3562",
  org.geotools.data,
  org.geotools.data.postgis,
index 59b3754075777e4740a595d9817ba77786fd4177..fcb299b54d413b2aa21196a2a7a028df62000d62 100644 (file)
@@ -7,4 +7,5 @@
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">\r
 \r
        <service ref="postGisDataStore" interface="org.geotools.data.DataStore" />\r
+       <service ref="backend" interface="org.argeo.slc.geotools.Backend" />\r
 </beans:beans>
\ No newline at end of file
index db78299865d3d4702fc4b8dbb9824fcf0efce751..e1a6e02f854f9afc6cd0e303793eb6d8a81fef26 100644 (file)
@@ -1,22 +1,41 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <beans xmlns="http://www.springframework.org/schema/beans"\r
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-       xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util"\r
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"\r
+       xmlns:util="http://www.springframework.org/schema/util" xmlns:osgi="http://www.springframework.org/schema/osgi"\r
        xsi:schemaLocation="\r
-       http://www.springframework.org/schema/beans\r
-       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\r
-       http://www.springframework.org/schema/util \r
-       http://www.springframework.org/schema/util/spring-util-2.5.xsd\r
+               http://www.springframework.org/schema/beans\r
+               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\r
+               http://www.springframework.org/schema/util \r
+               http://www.springframework.org/schema/util/spring-util-2.5.xsd\r
+               http://www.springframework.org/schema/osgi  \r
+               http://www.springframework.org/schema/osgi/spring-osgi-1.1.xsd\r
     ">\r
 \r
+       <bean id="backend" class="org.argeo.slc.gis.field.FieldBackend"\r
+               init-method="afterPropertiesSet">\r
+               <property name="dataSources">\r
+                       <set>\r
+                               <ref bean="dataSource" />\r
+                       </set>\r
+               </property>\r
+               <!-- <property name="vectors"> <bean class="org.argeo.slc.core.deploy.DefaultResourceSet"> \r
+                       <property name="base" value="file:/home/mbaudier/gis/projects/100122-EasternBalkans2010/data" \r
+                       /> <property name="include" value="*.shp" /> </bean> </property> <property \r
+                       name="rasters"> <bean class="org.argeo.slc.core.deploy.DefaultResourceSet"> \r
+                       <property name="base" value="file:/home/mbaudier/gis/data/100501-Poehali" \r
+                       /> <property name="include" value="*.gif" /> </bean> </property> -->\r
+               <property name="jaiImageIoClassLoader" ref="jai.imageio.bdClassLoader" />\r
+       </bean>\r
+\r
 \r
        <bean id="postGisDataStore" factory-bean="postGisDataStoreFactory"\r
                factory-method="createDataStore">\r
                <constructor-arg>\r
                        <map>\r
-                               <!-- Cannot access the .key property, wait for Spring 3.0 to do it properly \r
-                                       <entry key-ref="JDBCDataStore.DATASOURCE" value-ref="dataSource" /> -->\r
-                                       <entry key="Data Source" value-ref="dataSource" />\r
+                               <!-- Cannot access the .key property, wait for Spring 3.0 EL to do it \r
+                                       properly <entry key-ref="JDBCDataStore.DATASOURCE" value-ref="dataSource" \r
+                                       /> -->\r
+                               <entry key="Data Source" value-ref="dataSource" />\r
                        </map>\r
                </constructor-arg>\r
        </bean>\r
                <property name="maxIdle" value="2" />\r
        </bean>\r
 \r
+       <bean id="jai.imageio.bdClassLoader"\r
+               class="org.springframework.osgi.util.BundleDelegatingClassLoader"\r
+               factory-method="createBundleClassLoaderFor">\r
+               <constructor-arg>\r
+                       <osgi:bundle symbolic-name="org.argeo.dep.osgi.jai.imageio" />\r
+               </constructor-arg>\r
+       </bean>\r
+\r
+\r
 </beans>
\ No newline at end of file
diff --git a/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/AbstractDataDescriptor.java b/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/AbstractDataDescriptor.java
new file mode 100644 (file)
index 0000000..d36074e
--- /dev/null
@@ -0,0 +1,30 @@
+package org.argeo.slc.geotools;
+
+import java.util.UUID;
+
+public abstract class AbstractDataDescriptor implements DataDescriptor{
+       private String id;
+       private Boolean isLoaded;
+
+       public AbstractDataDescriptor() {
+               this.id = UUID.randomUUID().toString();
+               this.isLoaded = false;
+       }
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public Boolean getIsLoaded() {
+               return isLoaded;
+       }
+
+       public void setIsLoaded(Boolean isLoaded) {
+               this.isLoaded = isLoaded;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/Backend.java b/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/Backend.java
new file mode 100644 (file)
index 0000000..15898ea
--- /dev/null
@@ -0,0 +1,21 @@
+package org.argeo.slc.geotools;
+
+import java.util.Set;
+
+import org.geotools.data.DataStore;
+import org.geotools.data.FeatureSource;
+import org.opengis.coverage.grid.GridCoverage;
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+
+public interface Backend {
+
+       public Set<DataDescriptor> getAvailableData(DataDescriptor dataDescriptor);
+
+       public DataStore loadDataStore(DataDescriptor dataDescriptor);
+
+       public FeatureSource<SimpleFeatureType, SimpleFeature> loadFeatureSource(
+                       DataDescriptor dataDescriptor);
+
+       public GridCoverage loadGridCoverage(DataDescriptor dataDescriptor);
+}
diff --git a/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/DataDescriptor.java b/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/DataDescriptor.java
new file mode 100644 (file)
index 0000000..b10a846
--- /dev/null
@@ -0,0 +1,6 @@
+package org.argeo.slc.geotools;
+
+public interface DataDescriptor {
+       public String getId();
+
+}
diff --git a/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/FeatureSourceDataDescriptor.java b/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/FeatureSourceDataDescriptor.java
new file mode 100644 (file)
index 0000000..5d03d3e
--- /dev/null
@@ -0,0 +1,5 @@
+package org.argeo.slc.geotools.data;
+
+public interface FeatureSourceDataDescriptor {
+
+}
diff --git a/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/PostgisDataDescriptor.java b/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/PostgisDataDescriptor.java
new file mode 100644 (file)
index 0000000..09c8dd3
--- /dev/null
@@ -0,0 +1,31 @@
+package org.argeo.slc.geotools.data;
+
+import java.util.Set;
+
+import javax.sql.DataSource;
+
+import org.argeo.slc.geotools.AbstractDataDescriptor;
+
+public class PostgisDataDescriptor extends AbstractDataDescriptor {
+       private DataSource dataSource;
+
+       private Set<PostgisLayerDataDescriptor> layers = null;
+
+       public PostgisDataDescriptor(DataSource dataSource) {
+               super();
+               this.dataSource = dataSource;
+       }
+
+       public DataSource getDataSource() {
+               return dataSource;
+       }
+
+       public Set<PostgisLayerDataDescriptor> getLayers() {
+               return layers;
+       }
+
+       public void setLayers(Set<PostgisLayerDataDescriptor> layers) {
+               this.layers = layers;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/PostgisLayerDataDescriptor.java b/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/PostgisLayerDataDescriptor.java
new file mode 100644 (file)
index 0000000..f3c7288
--- /dev/null
@@ -0,0 +1,24 @@
+package org.argeo.slc.geotools.data;
+
+import org.argeo.slc.geotools.AbstractDataDescriptor;
+
+public class PostgisLayerDataDescriptor extends AbstractDataDescriptor
+               implements FeatureSourceDataDescriptor {
+       private PostgisDataDescriptor postGisDataDescriptor;
+       private String name;
+
+       public PostgisLayerDataDescriptor(
+                       PostgisDataDescriptor postgisDataDescriptor, String name) {
+               this.postGisDataDescriptor = postgisDataDescriptor;
+               this.name = name;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public PostgisDataDescriptor getPostGisDataDescriptor() {
+               return postGisDataDescriptor;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/VectorDataDescriptor.java b/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/VectorDataDescriptor.java
new file mode 100644 (file)
index 0000000..5ac47c6
--- /dev/null
@@ -0,0 +1,25 @@
+package org.argeo.slc.geotools.data;
+
+import java.io.IOException;
+
+import org.argeo.slc.geotools.AbstractDataDescriptor;
+import org.springframework.core.io.Resource;
+
+public class VectorDataDescriptor extends AbstractDataDescriptor implements
+               FeatureSourceDataDescriptor {
+       private final Resource resource;
+
+       public VectorDataDescriptor(Resource resource) throws IOException {
+               this.resource = resource;
+       }
+
+       public Resource getResource() {
+               return resource;
+       }
+
+       @Override
+       public String toString() {
+               return resource.toString();
+       }
+
+}
diff --git a/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/WorldImageDataDescriptor.java b/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/data/WorldImageDataDescriptor.java
new file mode 100644 (file)
index 0000000..c1db345
--- /dev/null
@@ -0,0 +1,24 @@
+package org.argeo.slc.geotools.data;
+
+import java.io.IOException;
+
+import org.argeo.slc.geotools.AbstractDataDescriptor;
+import org.springframework.core.io.Resource;
+
+public class WorldImageDataDescriptor extends AbstractDataDescriptor {
+       private final Resource resource;
+
+       public WorldImageDataDescriptor(Resource resource) throws IOException {
+               this.resource = resource;
+       }
+
+       public Resource getResource() {
+               return resource;
+       }
+
+       @Override
+       public String toString() {
+               return resource.toString();
+       }
+
+}
index 3e5926d143900190f35286291928d344b4c13493..319a385ac131c6793884aaecc532fc0ebba9ff9d 100644 (file)
@@ -25,8 +25,6 @@ import java.awt.geom.Point2D;
 import java.io.IOException;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.HashMap;
-import java.util.Map;
 
 import javax.media.jai.JAI;
 import javax.sql.DataSource;
@@ -44,7 +42,6 @@ import org.geotools.data.DataStore;
 import org.geotools.data.FeatureSource;
 import org.geotools.data.FileDataStoreFinder;
 import org.geotools.data.WorldFileReader;
-import org.geotools.data.postgis.PostgisNGDataStoreFactory;
 import org.geotools.factory.CommonFactoryFinder;
 import org.geotools.gce.image.WorldImageFormat;
 import org.geotools.geometry.DirectPosition2D;
@@ -226,30 +223,8 @@ public class GisFieldViewer implements InitializingBean, DisposableBean {
                }
 
                try {
-                       Map params = new HashMap();
-                       // params.put("dbtype", "postgis");
-                       // params.put("host", "air");
-                       // params.put("port", new Integer(5432));
-                       // params.put("database", "test_berlin");
-                       // params.put("user", "argeo");
-                       // params.put("passwd", "argeo");
-                       //
-                       // DataStore pgDatastore = DataStoreFinder.getDataStore(params);
-
-                       PostgisNGDataStoreFactory factory = new PostgisNGDataStoreFactory();
-                       // JDBCDataStore pgDatastore = new JDBCDataStore();
-                       // pgDatastore.setDataSource(dataSource);
-                       // pgDatastore.setSQLDialect(new PostGISDialect(pgDatastore));
-
-                       params.put(PostgisNGDataStoreFactory.DATASOURCE.key, dataSource);
-
-                       //JDBCDataStore pgDatastore = factory.createDataStore(params);
-
                        FeatureSource<SimpleFeatureType, SimpleFeature> source = postGisDataStore
                                        .getFeatureSource("ways");
-                       // log.debug("source CRS: "+source.getBounds().getCoordinateReferenceSystem());
-                       // log.debug("context CRS: "+mapContext.getCoordinateReferenceSystem());
-
                        mapContext.addLayer(source, createLineStyle());
                } catch (Exception e) {
                        log.error("Could not load db " + "" + ": " + e);
@@ -358,32 +333,8 @@ public class GisFieldViewer implements InitializingBean, DisposableBean {
                                                .currentPosition();
 
                                receiveNewPosition(currentPosition);
-                               // versatileZoomTool.setFieldPosition(new
-                               // Point2D(currentPosition
-                               // .getLocation().getX(), currentPosition.getLocation()
-                               // .getY()));
 
                                if (currentPosition != null) {
-
-                                       // if (mapPane.getDisplayArea().contains(
-                                       // currentPosition.getLocation().getCoordinate())) {
-                                       // SimpleFeature feature = POSITION
-                                       // .buildFeature(currentPosition);
-                                       // FeatureCollection<SimpleFeatureType, SimpleFeature>
-                                       // collection = new DefaultFeatureCollection(
-                                       // "Field Position "
-                                       // + fieldPositionDateFormat
-                                       // .format(currentPosition
-                                       // .getTimestamp()),
-                                       // POSITION.getFeatureType());
-                                       // collection.add(feature);
-                                       // if (mapLayer != null)
-                                       // mapPane.getMapContext().removeLayer(mapLayer);
-                                       // Style style = SLD.createSimpleStyle(POSITION
-                                       // .getFeatureType(), Color.RED);
-                                       // mapLayer = new DefaultMapLayer(collection, style, "");
-                                       // mapPane.getMapContext().addLayer(mapLayer);
-                                       // }
                                }
 
                                try {
index 6beae5463cb0fed750c00da07f62966955b59691..e0ff9fe3e32da386bbae2be6435a3376fd91ba39 100644 (file)
@@ -217,6 +217,8 @@ public class VersatileZoomTool extends AbstractZoomTool {
                                int sign = (clicks < 0 ? -1 : 1);
 
                                ReferencedEnvelope env = getMapPane().getDisplayArea();
+                               if (env == null)
+                                       return;
                                double width = env.getWidth();
                                double delta = width * clickToZoom * sign;
 
diff --git a/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/gis/field/FieldBackend.java b/runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/gis/field/FieldBackend.java
new file mode 100644 (file)
index 0000000..a6dc895
--- /dev/null
@@ -0,0 +1,227 @@
+package org.argeo.slc.gis.field;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.media.jai.JAI;
+import javax.sql.DataSource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.core.deploy.DefaultResourceSet;
+import org.argeo.slc.core.deploy.ResourceSet;
+import org.argeo.slc.geotools.Backend;
+import org.argeo.slc.geotools.DataDescriptor;
+import org.argeo.slc.geotools.data.PostgisDataDescriptor;
+import org.argeo.slc.geotools.data.PostgisLayerDataDescriptor;
+import org.argeo.slc.geotools.data.VectorDataDescriptor;
+import org.argeo.slc.geotools.data.WorldImageDataDescriptor;
+import org.geotools.data.DataStore;
+import org.geotools.data.FeatureSource;
+import org.geotools.data.FileDataStore;
+import org.geotools.data.FileDataStoreFinder;
+import org.geotools.data.WorldFileReader;
+import org.geotools.data.postgis.PostgisNGDataStoreFactory;
+import org.geotools.gce.image.WorldImageFormat;
+import org.geotools.styling.RasterSymbolizer;
+import org.geotools.styling.StyleBuilder;
+import org.opengis.coverage.grid.GridCoverage;
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+import org.opengis.feature.type.Name;
+import org.springframework.core.io.Resource;
+
+public class FieldBackend implements Backend {
+       private final static Log log = LogFactory.getLog(FieldBackend.class);
+
+       private ResourceSet vectors = new DefaultResourceSet();
+       private ResourceSet rasters = new DefaultResourceSet();
+       private Set<DataSource> dataSources = new HashSet<DataSource>();
+
+       private ClassLoader jaiImageIoClassLoader;
+       private PostgisNGDataStoreFactory postgisDataStoreFactory = new PostgisNGDataStoreFactory();
+
+       private Map<String, Object> cache = Collections
+                       .synchronizedMap(new HashMap<String, Object>());
+
+       private Set<DataDescriptor> resgisteredData = new HashSet<DataDescriptor>();
+
+       public Set<DataDescriptor> getAvailableData(DataDescriptor dataDescriptor) {
+               Set<DataDescriptor> availableData = new HashSet<DataDescriptor>();
+
+               if (dataDescriptor == null) {
+                       return resgisteredData;
+               } else if (dataDescriptor instanceof PostgisDataDescriptor) {
+                       PostgisDataDescriptor pdd = (PostgisDataDescriptor) dataDescriptor;
+                       if (pdd.getLayers() == null)
+                               try {
+                                       for (Name name : loadDataStore(dataDescriptor).getNames()) {
+                                               log.info(name);
+//                                             pdd.getLayers().add(
+//                                                             new PostgisLayerDataDescriptor(
+//                                                                             (PostgisDataDescriptor) dataDescriptor,
+//                                                                             name.getLocalPart()));
+                                       }
+                                       pdd.setLayers(new HashSet<PostgisLayerDataDescriptor>());
+                                       pdd.getLayers().add(
+                                                       new PostgisLayerDataDescriptor(
+                                                                       (PostgisDataDescriptor) dataDescriptor,
+                                                                       "ways"));
+                               } catch (Exception e) {
+                                       log.warn("Could not children of " + dataDescriptor + ": "
+                                                       + e);
+                               }
+                       availableData.addAll(pdd.getLayers());
+               }
+               return availableData;
+       }
+
+       public void afterPropertiesSet() {
+               for (Resource vector : vectors.listResources().values()) {
+                       try {
+                               DataDescriptor dd = new VectorDataDescriptor(vector);
+                               resgisteredData.add(dd);
+                       } catch (Exception e) {
+                               log.warn("Could not load " + vector + ": " + e);
+                       }
+               }
+               for (Resource raster : rasters.listResources().values()) {
+                       try {
+                               DataDescriptor dd = new WorldImageDataDescriptor(raster);
+                               resgisteredData.add(dd);
+                       } catch (Exception e) {
+                               log.warn("Could not load " + raster + ": " + e);
+                       }
+               }
+               for (DataSource dataSource : dataSources) {
+                       try {
+                               DataDescriptor dd = new PostgisDataDescriptor(dataSource);
+                               resgisteredData.add(dd);
+                       } catch (Exception e) {
+                               log.warn("Could not load " + dataSource + ": " + e);
+                       }
+               }
+       }
+
+       public DataStore loadDataStore(DataDescriptor dataDescriptor) {
+               if (cache.containsKey(dataDescriptor.getId()))
+                       return (DataStore) cache.get(dataDescriptor.getId());
+
+               try {
+                       if (dataDescriptor instanceof VectorDataDescriptor) {
+                               DataStore ds = FileDataStoreFinder
+                                               .getDataStore(((VectorDataDescriptor) dataDescriptor)
+                                                               .getResource().getURL());
+                               cache(dataDescriptor.getId(), ds);
+                               return ds;
+                       } else if (dataDescriptor instanceof PostgisDataDescriptor) {
+                               DataSource dataSource = ((PostgisDataDescriptor) dataDescriptor)
+                                               .getDataSource();
+                               Map params = new HashMap();
+                               params.put(PostgisNGDataStoreFactory.DATASOURCE.key, dataSource);
+                               DataStore ds = postgisDataStoreFactory.createDataStore(params);
+                               cache(dataDescriptor.getId(), ds);
+                               return ds;
+                       }
+               } catch (Exception e) {
+                       log.error("Could not load " + dataDescriptor + ": " + e);
+                       if (log.isTraceEnabled())
+                               log.trace("Stack", e);
+               }
+               return null;
+       }
+
+       public FeatureSource<SimpleFeatureType, SimpleFeature> loadFeatureSource(
+                       DataDescriptor dataDescriptor) {
+               if (cache.containsKey(dataDescriptor.getId()))
+                       return (FeatureSource<SimpleFeatureType, SimpleFeature>) cache
+                                       .get(dataDescriptor.getId());
+
+               try {
+                       if (dataDescriptor instanceof VectorDataDescriptor) {
+                               FeatureSource<SimpleFeatureType, SimpleFeature> fs = ((FileDataStore) loadDataStore(dataDescriptor))
+                                               .getFeatureSource();
+                               cache(dataDescriptor.getId(), fs);
+                               return fs;
+                       } else if (dataDescriptor instanceof PostgisLayerDataDescriptor) {
+                               PostgisLayerDataDescriptor pgldd = (PostgisLayerDataDescriptor) dataDescriptor;
+                               FeatureSource<SimpleFeatureType, SimpleFeature> fs = loadDataStore(
+                                               pgldd.getPostGisDataDescriptor()).getFeatureSource(
+                                               pgldd.getName());
+                               cache(dataDescriptor.getId(), fs);
+                               return fs;
+                       }
+               } catch (Exception e) {
+                       log.error("Could not load " + dataDescriptor + ": " + e);
+                       if (log.isTraceEnabled())
+                               log.trace("Stack", e);
+               }
+               return null;
+       }
+
+       public GridCoverage loadGridCoverage(DataDescriptor dataDescriptor) {
+               if (cache.containsKey(dataDescriptor.getId()))
+                       return (GridCoverage) cache.get(dataDescriptor.getId());
+
+               if (jaiImageIoClassLoader == null) {
+                       log.warn("No JAI ImageIO class loader available");
+                       return null;
+               }
+               ClassLoader currentContextCl = Thread.currentThread()
+                               .getContextClassLoader();
+
+               try {
+                       if (dataDescriptor instanceof WorldImageDataDescriptor) {
+                               Resource raster = ((WorldImageDataDescriptor) dataDescriptor)
+                                               .getResource();
+
+                               Thread.currentThread().setContextClassLoader(
+                                               jaiImageIoClassLoader);
+                               JAI.getDefaultInstance()
+                                               .getOperationRegistry()
+                                               .registerServices(
+                                                               WorldFileReader.class.getClassLoader());
+                               StyleBuilder styleBuilder = new StyleBuilder();
+                               RasterSymbolizer rs = styleBuilder.createRasterSymbolizer();
+                               rs.setGeometryPropertyName("geom");
+                               WorldImageFormat worldImageFormat = new WorldImageFormat();
+                               GridCoverage gridCoverage = worldImageFormat.getReader(
+                                               raster.getURL()).read(null);
+                               cache(dataDescriptor.getId(), gridCoverage);
+                               return gridCoverage;
+                       }
+               } catch (Exception e) {
+                       log.error("Could not load grid coverage " + dataDescriptor + ": "
+                                       + e);
+                       if (log.isTraceEnabled())
+                               log.trace("Stack", e);
+               } finally {
+                       Thread.currentThread().setContextClassLoader(currentContextCl);
+               }
+               return null;
+       }
+
+       protected void cache(String id, Object obj) {
+               cache.put(id, obj);
+       }
+
+       public void setVectors(ResourceSet vectors) {
+               this.vectors = vectors;
+       }
+
+       public void setRasters(ResourceSet rasters) {
+               this.rasters = rasters;
+       }
+
+       public void setDataSources(Set<DataSource> dataSources) {
+               this.dataSources = dataSources;
+       }
+
+       public void setJaiImageIoClassLoader(ClassLoader jaiImageIoClassLoader) {
+               this.jaiImageIoClassLoader = jaiImageIoClassLoader;
+       }
+
+}