layerandroid-locationmap-projectionsnutiteq

My current GPS Position under Nutiteq is not properly updated


as basis for my GPS functionality I've taken HelloMap3D Example of Nutiteq (Thx Jaak) and I adapted to show my current GPS position light different of this example, so, no growing yelow circles but a fix blue translucent circle with a center point as my current Position and works fine except the update. It should erase the past position if location is changed, so that this update happens as in the example in the method onLocationChanged enter image description here

This is the code in my Main Activity

protected void initGps(final MyLocationCircle locationCircle) {
    final Projection proj = mapView.getLayers().getBaseLayer().getProjection();

    locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {

             locationCircle.setLocation(proj, location);
             locationCircle.setVisible(true);

        }

         // Another Methods...
     }
}

I have adapted MyLocationCircle Class like this

public void update() {

    //Draw center with a drawable
    Bitmap bitmapPosition = BitmapFactory.decodeResource(activity.getResources(), R.drawable.ic_home);
    PointStyle pointStyle = PointStyle.builder().setBitmap(bitmapPosition).setColor(Color.BLUE).build();

    // Create/update Point
    if ( point == null ) {          
        point = new Point(circlePos, null, pointStyle, null);
        layer.add(point);
    } else { // We just have to change the Position to actual Position
        point.setMapPos(circlePos);
    }

    point.setVisible(visible);


    // Build closed circle
    circleVerts.clear();
    for (float tsj = 0; tsj <= 360; tsj += 360 / NR_OF_CIRCLE_VERTS) {
        MapPos mapPos = new MapPos(circleScale * Math.cos(tsj * Const.DEG_TO_RAD) + circlePos.x, circleScale * Math.sin(tsj * Const.DEG_TO_RAD) + circlePos.y);
        circleVerts.add(mapPos);
    }

    // Create/update line
    if (circle == null) {           
        LineStyle    lineStyle    = LineStyle.builder().setWidth(0.05f).setColor(Color.BLUE).build();
        PolygonStyle polygonStyle = PolygonStyle.builder().setColor(Color.BLUE & 0x80FFFFFF).setLineStyle(lineStyle).build();//0xE0FFFF
        circle = new Polygon(circleVerts, null, polygonStyle, circle_data);

        layer.add(circle);
    } else {
        circle.setVertexList(circleVerts);
    }
    circle.setVisible(visible);
}

public void setVisible(boolean visible) {
    this.visible = visible;
}

public void setLocation(Projection proj, Location location) {
    circlePos       = proj.fromWgs84(location.getLongitude(), location.getLatitude());
    projectionScale = (float) proj.getBounds().getWidth();
    circleRadius    = location.getAccuracy();

    // Here is the most important modification 
    update();
}

So, each time our Position changes is called onLocationChanged(Location location) Method and there will be called locationCircle.setLocation(location) and last there, it will be called update called.

The questions are, What am I making wrong? and How can I solve it?

Thank you in advance.


Solution

  • You create and add new circle with every update. You should reuse single one, just update vertexes with setVertexList(). In particular this line should be outside onLocationChanged cycle, somewhere in initGPS perhaps:

    circle = new Polygon(circleVerts, null, polygonStyle, circle_data);