[geotk] Objects animation/movement on map

johann sorel johann.sorel at geomatys.com
Fri Oct 14 01:00:10 PDT 2016


Hello,

On the RenderingContext2D class you can find several utility methods :
- context.switchToObjectiveCRS();
- context.switchToDisplayCRS();
- CoordinateReferenceSystem displayCRS = context.getDisplayCRS();
- AffineTransform2D trs = context.getObjectiveToDisplay();
- AffineTransform2D trs = context.getDisplayToObjective();

The objective CRS is the map CRS, if you use this mode then it will work 
in the CRS units. The display CRS is in pixels.

To obtain the scale factor between objective and display use the method :
- context.getScale();

You can use it to resize your circles.

After that it's up to you to combine the maths correctly to obtain the 
desired rendering ;)


Johann Sorel




On 14/10/2016 05:44, Gopinath Asutosh wrote:
> Hi Johann Sorel,
> Thanks for responding.
>
> I adapted SquareGraphics demo to take care of screen flickering issue. 
> Now every eqpt id refreshing its location in background and 
> map.getCanvas().repaint() is invoked from a separate thread every 15 
> secs to update locations of all eqpt on screen .
>
> But now i am having another problem. The squares are not changing size 
> when the map is zoomed in/out. How do I fix it?
>
> Code attached below:
> ===
> import java.awt.Color;
> import java.awt.Graphics2D;
> import java.awt.Shape;
> import java.awt.geom.Rectangle2D;
> import java.awt.geom.RoundRectangle2D;
> import java.sql.Connection;
> import java.sql.PreparedStatement;
> import java.sql.ResultSet;
> import java.sql.SQLException;
> import java.util.Collection;
> import java.util.List;
> import java.util.concurrent.Executors;
> import java.util.concurrent.ScheduledExecutorService;
> import java.util.concurrent.TimeUnit;
> import org.apache.sis.geometry.GeneralDirectPosition;
> import org.apache.sis.storage.DataStoreException;
> import org.geotoolkit.display.canvas.AbstractReferencedCanvas2D;
>
> import org.geotoolkit.display.canvas.RenderingContext;
> import org.geotoolkit.display.canvas.VisitFilter;
> import org.geotoolkit.display.primitive.SearchArea;
> //import org.geotoolkit.display.VisitFilter;
> //import org.geotoolkit.display.SearchArea;
> import org.geotoolkit.display2d.canvas.J2DCanvas;
> import org.geotoolkit.display2d.canvas.RenderingContext2D;
> import org.geotoolkit.display2d.primitive.GraphicJ2D;
> import org.geotoolkit.referencing.CRS;
>
> import org.opengis.display.primitive.Graphic;
> import org.opengis.geometry.DirectPosition;
> import org.opengis.geometry.Envelope;
> import org.opengis.geometry.MismatchedDimensionException;
> import org.opengis.referencing.crs.CoordinateReferenceSystem;
> import org.opengis.referencing.operation.MathTransform;
> import org.opengis.referencing.operation.TransformException;
> import org.opengis.util.FactoryException;
> import org.openide.util.Exceptions;
> import org.openide.util.Lookup;
>
> public class SquaresGraphicTorpedo implements GraphicJ2D, Runnable {
>
>     double lat = 22.796212;
>     double lon = 86.198888;
>     String eqptId = null;
>     ScheduledExecutorService executor = 
> Executors.newScheduledThreadPool(1);
>
>     public SquaresGraphicTorpedo(String eqptId) {
>         this.eqptId = eqptId;
>         int initialDelay = 0;
>         int period = 1;
>         executor.scheduleWithFixedDelay(this, initialDelay, period, 
> TimeUnit.MINUTES);
>     }
>
>     @Override
>     public void paint(RenderingContext2D context) {
>
>         final Graphics2D g2d = context.getGraphics();
>
>
> //        context.switchToObjectiveCRS();
>         try {
>             CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:4326");
>             CoordinateReferenceSystem targetCRS = context.getDisplayCRS();
>             MathTransform tr = CRS.findMathTransform(sourceCRS, 
> targetCRS);
>             /*
>          * From this point we can convert an arbitrary amount of 
> coordinates using the
>          * same MathTransform object. It could be in concurrent 
> threads if we wish.
>              */
>             DirectPosition sourcePt = new GeneralDirectPosition(
>                     lat, // 27°59'17"N
>                     lon);  // 86°55'31"E
>             DirectPosition targetPt = tr.transform(sourcePt, null);
>
> //            System.out.println("ptDst.x: " + 
> targetPt.getCoordinate()[0] + " ptDst.y: " + targetPt.getCoordinate()[1]);
>             RoundRectangle2D.Double rect = new 
> RoundRectangle2D.Double(targetPt.getCoordinate()[0], 
> targetPt.getCoordinate()[1], 20, 10, 10, 10);
>
>             g2d.setPaint(Color.RED);
>             g2d.fill(rect);
>
>         } catch (FactoryException | MismatchedDimensionException | 
> TransformException ex) {
>             Exceptions.printStackTrace(ex);
>         }
>
>     }
>
> @Override
>     public void run() {
>
>         getLastLocationOfTheDay();
>
>     }
>
>     private void getLastLocationOfTheDay() {
>
>     }
>
>
>
>     @Override
>     public List<Graphic> getGraphicAt(RenderingContext context, 
> SearchArea mask, VisitFilter filter, List<Graphic> graphics) {
>         return graphics;
>     }
>
>     @Override
>     public Object getUserObject() {
>         return null;
>     }
>
>     @Override
>     public Envelope getEnvelope() {
>         return null;
>     }
>
>     @Override
>     public double getZOrderHint() {
>         return 0.0;
>     }
>
>     @Override
>     public void setZOrderHint(double d) {
>
>     }
>
> ==
> Thanks and regards
>
> Asutosh Gopinath
>
>
> On Thursday, October 13, 2016 1:54 PM, johann sorel 
> <johann.sorel at geomatys.com> wrote:
>
>
> Hello,
>
> The rendering engine is stateless by default, but we have some 
> possible alternatives.
>
> Solution 1 :
> final JMap2D jmap = new JMap2D();
> jmap.getCanvas().setRenderingHint(GO2Hints.KEY_BEHAVIOR_MODE, 
> GO2Hints.BEHAVIOR_KEEP_TILE);
> This will ask the swing widget to replace the image at the last moment 
> when possible, it should reduce the flickering.
> You can also try the 'GO2Hints.BEHAVIOR_ON_FINISH'
>
> Solution 2 :
> final JMap2D jmap = new JMap2D(true);
> The boolean argument is for 'statefull', the engine will cache more 
> informations and use separate buffers
> for each layer. But it use more memory.
>
> Solution 3 :
> There is also the solution to create a custom decoration over the map,
> A demo is available in the demo-samples module, package : 
> org.geotoolkit.pending.demo.rendering.customdecoration
> But it require a lot more work.
>
>
>
> Johann Sorel
>
>
>
> On 12/10/2016 06:51, Gopinath Asutosh wrote:
>> Hi ,
>> I want to show over 100 objects representing vehicles moving on GIS 
>> map. The locations of vehicle change every 10 secs.
>> I tried to create a circle with its center located on GPS coordinates 
>> obtained from devices mounted on vehicles. Whenever new coordinates 
>> are received I create a new circle and call store.updateFeatures. 
>> This plots the circles on new location but it also simultaneously 
>> causes the screen to flicker a lot due to which the animation effect 
>> is lost.
>>
>> It is possible to animate any object using geotoolkit without causing 
>> the screen to flicker.
>>
>> Thanks and regards
>> Asutosh Gopinath
>>
>>
>> _______________________________________________
>> Geotoolkit mailing list
>> Geotoolkit at lists.osgeo.org <mailto:Geotoolkit at lists.osgeo.org>
>> http://lists.osgeo.org/mailman/listinfo/geotoolkit
>
>
> _______________________________________________
> Geotoolkit mailing list
> Geotoolkit at lists.osgeo.org <mailto:Geotoolkit at lists.osgeo.org>
> http://lists.osgeo.org/mailman/listinfo/geotoolkit
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/geotoolkit/attachments/20161014/9b3046d5/attachment-0001.html>


More information about the Geotoolkit mailing list