2010-08-05 20 views
5

Actualmente estoy desarrollando una aplicación para Android que utiliza el servicio de mapas de Google. Debido a que los usuarios podrán ver miles de marcadores, me gustaría cargar solo aquellos que están actualmente dentro de los límites del mapa (es decir, cuando el usuario mira un mosaico de mapa específico). Sé cómo hacerlo con javascript/html. Sin embargo, Android no parece proporcionar ningún método similar, como containsLatLng (latlng) o getBounds (solo encontré getLatitudeSpan y getLongitudeSpan, pero no sé cómo puedo usarlos para lograr el efecto similar).¿Cómo cargar marcadores dinámicamente para la posición actual en Android google-maps?

¿Alguien me puede dar alguna pista sobre eso? Agradecería enormemente cualquier ayuda o al menos apuntándome en la dirección correcta.

Respuesta

7

Puede usar getMapCenter y simplemente sumar o restar el rango de latitud o longitud (dividido por 2, por supuesto) para encontrar los límites.

+0

Gracias por la pista Twaroog - funcionó bastante bien. Pude avanzar un poco más en mi proyecto gracias a ti. – Pavel

+0

No hay problema, lo hago de la misma manera en mi proyecto también. – LordTwaroog

2

¿De dónde vienen esas marcas de lugar? Si provienen de un servicio web, verifique si el servicio web admite consultas espaciales. Si es un punto básico en extensión (envolvente rectangular), podría hacer algo como esto:

Nota: (xmin, ymin -> xmax, ymax) son los límites de su rectángulo (extensión).

def is_point_in_rect(px, py, xmin, ymin, xmax, ymax): 
    if px >= xmin and px <= xmax: 
    if py >= ymin and py <= ymax: 
     return True 
    else: 
    return False 

Esto es algo muy simple. Incluso puede usar la API de datos de Google Maps para almacenar sus marcas de posición y tiene un mecanismo para ejecutar consultas espaciales.

Si sus datos están en Google App Engine, entonces podría usar consultas basadas en GeoPt o podría hacer rodar su propio índice espacial. Check out http://code.google.com/p/geomodel/

+0

Vienen de sql local db en este momento Rahul, pero en el futuro también me gustaría expandir esto a db remoto. – Pavel

2

Estoy haciendo algo similar a ti pero estoy usando un servidor. La razón por la que lo hago es por razones de computación. Cuando la aplicación comienza por primera vez, se envía una solicitud HTTP a un script php que contiene una consulta MySQL. La secuencia de comandos php recibe los usuarios lat/long actual y devuelve en un JSON todos los puntos dentro de 1KM de la ubicación actual. La aplicación luego analiza ese JSON en una base de datos MySQL local y hace cosas con él.

para enviar la petición HTTP y analizar el JSON en una base de datos que estoy haciendo lo siguiente ..

//http post 
try{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://URL"); 
     httppost.setEntity(new UrlEncodedFormEntity(parameters)); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     InputStream is = entity.getContent(); 

//convert response to string 

     BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
     } 
     is.close(); 

     result=sb.toString(); 
}catch(Exception e){ 
    new AlertDialog.Builder(this) 
     .setTitle("Woops!") 
     .setMessage("Getlocations:It appears the server is not reachable. Check your connectivity and try again.") 
     .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 

     public void onClick(DialogInterface dialog, 
       int which) { 
      //User wants to start activity.. 

     } 
     }) 
     .show(); 
     Log.e("log_tag", "Error in connection or convert "+e.toString()); 
} 

//parse json data 
try{ 
    System.out.println("parsing data"); 
     JSONArray jArray = new JSONArray(result); 
     if(icount != 0){ 
      try{ 
       SQLiteDatabase db = tweets.getWritableDatabase(); 
       db.delete(TABLE_NAME,null,null); 
      }finally { 
       tweets.close(); 
      } 
     } 
     //TODO: Change this to num 
     for(int i=0;i<jArray.length() && q < 1;i++){ 
      System.out.println("ARRAY LENGTH " + jArray.length()); 
       q++; 
       JSONObject json_data = jArray.getJSONObject(i); 

         System.out.println("Getting Info"); 
         Double lat = json_data.getDouble("lat"); 
         Double lng = json_data.getDouble("lng"); 
         String link = json_data.getString("link"); 
         String message = json_data.getString("message"); 
         String sname = json_data.getString("sname"); 
         String name = json_data.getString("name"); 
         //Add each entry to SQL database... 
         System.out.println("Adding table row!"); 
         try{ 
          addloc(name,sname,message,link,lat,lng); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } finally { 
          tweets.close(); 
         } 
         count(); 


     } 
}catch(JSONException e){ 
    new AlertDialog.Builder(this) 
     .setTitle("Woops!") 
     .setMessage("Getlocations: It appears something went wrong processing the information.") 
     .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 

     public void onClick(DialogInterface dialog, 
       int which) { 
      //User wants to start activity.. 

     } 
     }) 
     .show(); 
     Log.e("log_tag", "Error parsing data "+e.toString()); 
} 

Para que esto funcione todo lo que necesita es un archivo PHP corta que tiene el/Algo lng Lat como ...

<?php 
    mysql_connect("host","user","pass"); 
    mysql_select_db("database"); 
    $lat = $_REQUEST['currlat']; 
    $lng = $_REQUEST['currlng']; 
    $q=mysql_query("QUERY") or die(mysql_error()); 
    if (mysql_num_rows($q) == 0) { 
echo "No rows found, nothing to print so am exiting"; 
exit; 
} 
if(!q){ 
echo "NO RESULT"; 
exit; 
} 
while($e=mysql_fetch_assoc($q)) 
    $output[]=$e; 
print(json_encode($output)); 

mysql_close(); 
?> 

Eso incluirá los valores e imprimirá los resultados en JSON.

// edit: Para obtener el lat/lng en primer lugar, estoy usando el GPS.

Espero que esto ayude.

+0

Interesante Aidanc. Esto es de hecho muy útil. ¡Muchas gracias por compartir este código! – Pavel

+0

No hay problema, tenga en cuenta que en mi php no estoy usando declaraciones preparadas. Si tuvieras que hacer este código de producción, tendrías que cambiar eso un poco. – Aidanc

2

La respuesta dependerá de dónde provengan sus marcadores. ¿Están almacenados dentro del dispositivo Android o provienen de un servidor web? De cualquier manera, si necesita representar miles de ubicaciones simultáneamente, es posible que necesite implementar algún tipo de clúster, lo que se puede hacer en el cliente o en el servidor, si los marcadores provienen de la web.

Véase, por ejemplo, este lado del servidor clusterer (2 versiones diferentes):

http://maps.forum.nu/server_side_clusterer

http://maps.forum.nu/server_side_clusterer/index2.php

o una clusterer lado del cliente:

http://gmaps-utility-library.googlecode.com/svn/trunk/markerclusterer/1.0/

Otra alternativa sería usar baldosas personalizadas (como Google lo hace), pero dependiendo de sus necesidades exactas puede ser excesiva.

Cuestiones relacionadas