2011-05-17 16 views
10

Quiero dibujar un círculo en la vista de mapa. Quiero que el usuario ingrese el radio y para ese radio, tengo que mostrar el círculo en el mapa. Después de eso, tengo que mostrar marcadores en algunas ubicaciones de ese círculo.Dibujar círculo de cierto radio en la vista de mapa en Android

Sé cómo mostrar marcadores en la vista del mapa.

ayúdame a dibujar un círculo en la vista del mapa y mostrar los marcadores en ese límite del círculo.

Es muy importante para mí, yo estoy tratando de encontrar pistas en Internet, pero no soy capaz de hacer caro, debería ayudarme ........

Gracias de antemano ..

+0

Esta biblioteca puede ayudar - https://github.com/i-schuetz/map_areas – Ixx

Respuesta

8

En la aplicación de la ItemizedOverlay, hacer algo como el método de la drawCircleonDraw método

protected void drawCircle(Canvas canvas, Point curScreenCoords) { 
    curScreenCoords = toScreenPoint(curScreenCoords); 
    int CIRCLE_RADIUS = 50; 
    // Draw inner info window 
    canvas.drawCircle((float) curScreenCoords.x, (float) curScreenCoords.y, CIRCLE_RADIUS, getInnerPaint()); 
    // if needed, draw a border for info window 
    canvas.drawCircle(curScreenCoords.x, curScreenCoordsy, CIRCLE_RADIUS, getBorderPaint()); 
} 

private Paint innerPaint, borderPaint; 

public Paint getInnerPaint() { 
    if (innerPaint == null) { 
     innerPaint = new Paint(); 
     innerPaint.setARGB(225, 68, 89, 82); // gray 
     innerPaint.setAntiAlias(true); 
    } 
    return innerPaint; 
} 

public Paint getBorderPaint() { 
    if (borderPaint == null) { 
     borderPaint = new Paint(); 
     borderPaint.setARGB(255, 68, 89, 82); 
     borderPaint.setAntiAlias(true); 
     borderPaint.setStyle(Style.STROKE); 
     borderPaint.setStrokeWidth(2); 
    } 
    return borderPaint; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    Point p = new Point(); 
    for(OverlayItem item : items) { 
     drawCircle(canvas, getProjection().toPixels(item.getPoint(), p)); 
    } 
} 
+0

gracias, lo intentaré –

+0

Si está utilizando un itemizedoverlay, que también tiene un método de sorteo, lo mismo aplica – NickT

0

Si coloca el siguiente código en el método de sorteo de su superposición, dibujará un círculo de radio de 20 píxeles en el centro de su MAPview

@Override 
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, 
long when) { 
    .... 
    .... 

    Paint lp4; 
    lp4 = new Paint(); 
    lp4.setColor(Color.RED); 
    lp4.setAntiAlias(true); 
    lp4.setStyle(Style.STROKE); 
    canvas.drawCircle(mapView.getWidth()/2, mapView.getHeight()/2, 20, lp4); 

    .... 
    .... 
    mapView.invalidate(); 
} 

usted debe ser capaz de adaptarlo a sus necesidades

+0

¿Puedes explicarme más claramente? –

+0

Supongo que tienes una clase MapOverlay que extiende com.google.android.maps.Overlay para dibujar tus marcadores. Esto tendrá un método de superclase 'draw' con parámetros de mapView y canvas. Anule el sorteo de este método como se describe, luego dibuje el círculo en el lienzo. – NickT

+0

Lo tengo. Gracias... –

4

Esto no es perfecta, pero aquí hay un poco de código que puse juntos para poner un círculo en un mapa. Podría expandirlo fácilmente para establecer el color del círculo, etc. La mayoría de las muestras de otros códigos que he visto no han tenido en cuenta la ampliación del tamaño del círculo con el nivel de zoom, que es un requisito común al crear círculos. Circle Radius está en metros.

import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapView; 
import com.google.android.maps.Overlay; 
import com.google.android.maps.Projection; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Point; 
public class CircleOverlay extends Overlay { 

    Context context; 
    double mLat; 
    double mLon; 
    float mRadius; 

    public CircleOverlay(Context _context, double _lat, double _lon, float radius) { 
      context = _context; 
      mLat = _lat; 
      mLon = _lon; 
      mRadius = radius; 
    } 

    public void draw(Canvas canvas, MapView mapView, boolean shadow) { 

     super.draw(canvas, mapView, shadow); 

     Projection projection = mapView.getProjection(); 

     Point pt = new Point(); 

     GeoPoint geo = new GeoPoint((int) (mLat *1e6), (int)(mLon * 1e6)); 

     projection.toPixels(geo ,pt); 
     float circleRadius = projection.metersToEquatorPixels(mRadius); 

     Paint innerCirclePaint; 

     innerCirclePaint = new Paint(); 
     innerCirclePaint.setColor(Color.BLUE); 
     innerCirclePaint.setAlpha(25); 
     innerCirclePaint.setAntiAlias(true); 

     innerCirclePaint.setStyle(Paint.Style.FILL); 

     canvas.drawCircle((float)pt.x, (float)pt.y, circleRadius, innerCirclePaint); 
    } 
} 
10

En caso de que alguien estuviera buscando una respuesta usando Google Maps API v2, aquí hay un fragmento de lo que hice. Es realmente más un enfoque geográfico.

public class MapDrawer { 

private GoogleMap map; 
private static int EARTH_RADIUS = 6371000; 

public MapDrawer(GoogleMap map) { 
    this.map = map; 
} 

private LatLng getPoint(LatLng center, int radius, double angle) { 
    // Get the coordinates of a circle point at the given angle 
    double east = radius * Math.cos(angle); 
    double north = radius * Math.sin(angle); 

    double cLat = center.latitude; 
    double cLng = center.longitude; 
    double latRadius = EARTH_RADIUS * Math.cos(cLat/180 * Math.PI); 

    double newLat = cLat + (north/EARTH_RADIUS/Math.PI * 180); 
    double newLng = cLng + (east/latRadius/Math.PI * 180); 

    return new LatLng(newLat, newLng); 
} 

public Polygon drawCircle(LatLng center, int radius) { 
    // Clear the map to remove the previous circle 
    map.clear(); 
    // Generate the points 
    List<LatLng> points = new ArrayList<LatLng>(); 
    int totalPonts = 30; // number of corners of the pseudo-circle 
    for (int i = 0; i < totalPonts; i++) { 
     points.add(getPoint(center, radius, i*2*Math.PI/totalPonts)); 
    } 
    // Create and return the polygon 
    return map.addPolygon(new PolygonOptions().addAll(points).strokeWidth(2).strokeColor(0x700a420b)); 
} 

}

Lo bueno de esto es que usted no tiene que volver a dibujar nada después de zoom o la exploración del mapa - el círculo se hace cambiar de tamaño y movido en consecuencia. El inconveniente es que esto no funciona si quiere un círculo en el polo norte o sur: se irá todo el tiempo, pero, con suerte, ese no es el caso el 99% del tiempo :)

+0

Hola @Grisha S, me enfrenta un problema en el que quiero hacer un círculo alrededor de mi marcador que crece y se encoge cuando el usuario amplía o aleja, creo que este código funcionará, pero ¿cómo puedo llamar a esta clase y cuáles son los parámetros para enviar a la función que ha realizado ..... por favor ayuda si ves esto ... ...... gracias –

+1

2 @SalmanKhan: Sí, el código debería funcionar en su situación. Primero, cree una instancia de la clase utilizando el objeto GoogleMap que desea dibujar: MapDrawer mapDrawer = new MapDrawer (map); y luego llama al método drawCircle dándole: 1) un objeto LatLng que especifica las coordenadas geográficas del centro del círculo que deseas dibujar, 2) un número entero que representa el radio del círculo en metros –

+0

antes que nada, gracias por la respuesta Grisha funciona bien para mí, pero cada vez que agrego el círculo a mi mapa todos los marcadores se vuelven invisibles, y cuando estoy comentando la llamada al método drawCircle me muestra todos los marcadores nuevamente, no sé qué es el problema, ¿me puede ayudar por favor ..... –

17

Solo para actualizar esto ... lo han hecho muy fácil de hacer en Google Maps API v2.

mMap.addCircle(new CircleOptions() 
     .center(center) 
     .radius(radius) 
     .strokeWidth(0f) 
     .fillColor(0x550000FF)); 

Donde radius está en metros.

En cuanto a los marcadores en el límite, que debería ser relativamente fácil de hacer - sólo tienes que seguir el Demo 'Círculos' en el código de ejemplo de Google Maps aquí: https://developers.google.com/maps/documentation/android/intro#sample_code

+0

bien, se está dibujando un círculo. Pero quiero obtener los puntos latitudinales de ese círculo dibujados, porque quiero buscar algunas propiedades nuevas que caigan en esa área del círculo dibujada. ¿Alguien podría ayudarme a cómo lograr esto? – Mahe

+0

Este será el hombre de respuesta aceptado .. buena ayuda. @Mahe ni idea al respecto. – Noman

+0

Esto funcionó para mí. Debe ser la respuesta aceptada! – Aci89

Cuestiones relacionadas