2010-12-13 8 views
7

Je suis en train de reproduire cette fonctionnalité des cartes dans Android: Custom Map OverlayCréation personnalisée superposition sur la carte

Vous pouvez voir que sur la carte, il y a un cercle représentant la plage que l'utilisateur a sélectionné.

Dans mon application, je veux également qu'un dragger réside sur le périmètre du cercle, qui peut être déplacé pour redéfinir le rayon.

Si quelqu'un pouvait me dire comment dessiner des superpositions personnalisables et des graphiques 2D sur la carte, je peux faire autre chose par moi-même.

Merci!

L'application complète peut être atteint à this link

+0

Vérifiez cette bibliothèque, il a exactement cette fonctionnalité: https://github.com/i-schuetz/map_areas – Ixx

Répondre

18

D'accord, j'ai essayé de faire des choses sur mon propre, et de mettre ce code pour obtenir l'effet ci-dessus:

public class MarkerOverlay extends Overlay { 

    Geocoder geoCoder = null; 

    public MarkerOverlay() { 
     super(); 
    } 


    @Override 
    public boolean onTap(GeoPoint geoPoint, MapView mapView){ 
     selectedLatitude = geoPoint.getLatitudeE6(); 
     selectedLongitude = geoPoint.getLongitudeE6(); 
     return super.onTap(geoPoint,mapView); 
    } 

    @Override 
    public void draw(Canvas canvas, MapView mapV, boolean shadow){ 

     if(shadow){ 
      Projection projection = mapV.getProjection(); 
      Point pt = new Point(); 
      projection.toPixels(globalGeoPoint,pt); 

      GeoPoint newGeos = new GeoPoint(selectedLat+(100),selectedLong); // adjust your radius accordingly 
      Point pt2 = new Point(); 
      projection.toPixels(newGeos,pt2); 
      float circleRadius = Math.abs(pt2.y-pt.y); 

      Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 

      circlePaint.setColor(0x30000000); 
      circlePaint.setStyle(Style.FILL_AND_STROKE); 
      canvas.drawCircle((float)pt.x, (float)pt.y, circleRadius, circlePaint); 

      circlePaint.setColor(0x99000000); 
      circlePaint.setStyle(Style.STROKE); 
      canvas.drawCircle((float)pt.x, (float)pt.y, circleRadius, circlePaint); 

      Bitmap markerBitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(),R.drawable.pin); 
      canvas.drawBitmap(markerBitmap,pt.x,pt.y-markerBitmap.getHeight(),null); 

      super.draw(canvas,mapV,shadow); 
     } 
    } 
} 

Cela me laisser effet suivant:

Effect on Map

Le calcul utilisé peut ne pas être ce que vous voulez.
Son juste à des fins de démonstration.
Le calcul réel de distance/distance nécessite également l'utilisation d'un roulement et a une formule spécifique. Faites-moi savoir si vous avez des questions à ce sujet.

+0

qu'est ce que selectlatitude et longidute? Où avez-vous utilisé les valeurs de latitude et de longitude? S'il vous plaît guide je veux mettre en œuvre la même chose. – UMAR

+0

et s'il vous plaît coller le code de son utilisation de google map. comment vous appelez cette classe toute aide serait appréciée. – UMAR

+0

Désolé, c'est la latitude/longitude sur laquelle l'utilisateur a tapé. c'est une variable globale qui contient ces valeurs. Cette classe est une classe interne de mon 'MapActivity' –

1

étendre la classe ItemizedOverlay pour remplacer la méthode draw(). Le Canvas où les superpositions sont dessinées est passé à cette méthode et vous pouvez appeler drawCircle ou tout ce qui est nécessaire pour faire apparaître votre dragueur de gamme.

+0

Ceci est un bien option, mais comme il peut être vu dans l'image ci-dessus, je vais avoir besoin des points où un marqueur est actuellement. D'abord, il me donnera des points de géo, et je devrai les convertir en format de pixel d'écran (coordonnées comme x, y) je ne peux rien pour ça! : -/ –

+0

Check this out: http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapView.html#getProjection%28%29 – ognian

+0

Cool. J'ai les points de la souris. Cependant, puisque j'utilise aussi la méthode onTap pour placer un marqueur à l'endroit où l'utilisateur clique, après avoir écrasé la méthode draw(), le mécanisme onTap ne fonctionne pas. Parce qu'il appelait la méthode draw() par défaut pour mettre en place des marqueurs, que j'ai remplacée maintenant. Toute solution à cela !? –

0

Un exemple de code pour dessiner un cercle avec le pushpin:

public class MapDemoActivity extends MapActivity { 
    MapView mapView; 
    MapController mc; 
    GeoPoint p; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mapView = (MapView) findViewById(R.id.mapView); 
    LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom); 
    View zoomView = mapView.getZoomControls(); 

    zoomLayout.addView(zoomView, 
     new LinearLayout.LayoutParams(
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT)); 
    mapView.displayZoomControls(true); 

    mc = mapView.getController();   
    String coordinates[] = {"28.38", "77.12"}; 
    double lat = Double.parseDouble(coordinates[0]); 
    double lng = Double.parseDouble(coordinates[1]); 

    p = new GeoPoint(
     (int) (lat * 1E6), 
     (int) (lng * 1E6)); 

    mc.animateTo(p); 
    mc.setZoom(8); 
    //---Add a location marker--- 
    MapOverlay mapOverlay = new MapOverlay(); 
    List<Overlay> listOfOverlays = mapView.getOverlays(); 
    listOfOverlays.clear(); 
    listOfOverlays.add(mapOverlay);   
    mapView.invalidate(); 
    } 

    class MapOverlay extends com.google.android.maps.Overlay 
{ 
    @Override 
    public boolean draw(Canvas canvas, MapView mapView, 
    boolean shadow, long when) 
    { 
     super.draw(canvas, mapView, shadow);     

     //---translate the GeoPoint to screen pixels--- 
     Point screenPts = new Point(); 
     mapView.getProjection().toPixels(p, screenPts); 
     //--------------draw circle----------------------    

     Point pt=mapView.getProjection().toPixels(p,screenPts); 

     Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     circlePaint.setColor(0x30000000); 
     circlePaint.setStyle(Style.FILL_AND_STROKE); 
     canvas.drawCircle(screenPts.x, screenPts.y, 50, circlePaint);   

     //---add the marker--- 
     Bitmap bmp = BitmapFactory.decodeResource(
      getResources(), R.drawable.pin);    
     canvas.drawBitmap(bmp, screenPts.x, screenPts.y-bmp.getHeight(), null);    
     super.draw(canvas,mapView,shadow); 

     return true; 

    } 
} 
@Override 
protected boolean isRouteDisplayed() { 
    // TODO Auto-generated method stub 
    return false; 
} 
} 
+0

HI manaco ... en cours d'exécution j'ai quelques doutes dans votre code. pour la fonctionnalité de zoom il y a le zoom du bouton ou tout? – NovusMobile

+0

@denny J'ai utilisé les commandes de zoom dans main.xml Reportez-vous à ce lien pour en savoir plus sur la carte [link] (http://mobiforge.com/developing/story/using-google-maps-android) –

Questions connexes