2010-08-05 6 views
5

Ich entwickle gerade eine App für Android, die Google Map Service verwendet. Da Benutzer Tausende von Markern sehen können, möchte ich nur diejenigen laden, die sich derzeit innerhalb der Kartengrenzen befinden (d. H. Wenn der Benutzer eine bestimmte Kartenkachel betrachtet). Ich weiß, wie man es mit javascript/html macht. Android scheint jedoch keine ähnlichen Methoden wie containsLatLng (latlng) oder getBounds zu bieten (ich habe nur getLatitudeSpan und getLongitudeSpan gefunden, weiß aber nicht, wie ich sie verwenden kann, um einen ähnlichen Effekt zu erzielen).Wie können Marker dynamisch für die aktuelle Position in Android google-maps geladen werden?

Kann mir jemand einen Hinweis darauf geben? Ich würde jede Hilfe sehr schätzen oder zumindest in die richtige Richtung zeigen.

Antwort

7

Sie könnten getMapCenter verwenden und einfach die Breiten- oder Längengradspanne (geteilt durch 2) addieren oder subtrahieren, um die Grenzen zu finden.

+0

Vielen Dank für den Hinweis Twaroog - es hat ganz gut funktioniert. Dank dir konnte ich mit meinem Projekt ein Stück weiter gehen. – Pavel

+0

Kein Problem, ich mache das auch in meinem Projekt. – LordTwaroog

2

Woher kommen diese Ortsmarken? Wenn sie von einem Webdienst kommen, überprüfen Sie, ob der Webdienst räumliche Abfragen unterstützt. Wenn es sich um einen grundlegenden Punkt im Umfang (rechteckiger Umschlag) handelt, könnten Sie etwas tun:

Hinweis: (xmin, ymin -> xmax, ymax) sind die Grenzen Ihres Rechtecks ​​(Ausdehnung).

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 

Dies ist etwas sehr einfaches. Sie können sogar die Google Maps Data-API verwenden, um Ihre Ortsmarken zu speichern, und einen Mechanismus zum Ausführen räumlicher Abfragen.

Wenn sich Ihre Daten in Google App Engine befinden, können Sie GeoPt-basierte Abfragen verwenden oder Ihren eigenen räumlichen Index rollen. Check out http://code.google.com/p/geomodel/

+0

Sie kommen von lokalen sql db im Moment Rahul, aber in Zukunft möchte ich diese auch auf remote db erweitern. – Pavel

2

Ich mache etwas ähnliches zu dir selbst, aber ich benutze einen Server. Der Grund, warum ich das tue, ist aus Rechengründen. Wenn die Anwendung zum ersten Mal gestartet wird, wird eine HTTP-Anfrage an ein PHP-Skript gesendet, das eine MySQL-Abfrage enthält. Das PHP-Skript empfängt den aktuellen Lat/Long des Benutzers und gibt in einem JSON alle Punkte innerhalb von 1 KM des aktuellen Standorts zurück. Die Anwendung analysiert dann diesen JSON in einer lokalen MySQL-Datenbank und erledigt damit.

Um die HTTP-Anforderung und analysieren, um die JSON in eine Datenbank ich folgendes mache ..

//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()); 
} 

Hierzu zu senden eine Datei kurze PHP ist alles was Sie brauchen dafür einzusetzen, den Lat/lng Etwas nimmt wie ...

<?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(); 
?> 

Das wird die Werte aufnehmen und Ergebnisse in JSON drucken.

// edit: Um den lat/lng an erster Stelle zu bekommen benutze ich das GPS.

Hoffe, das hilft.

+0

Interessante Aidanc. Dies ist in der Tat sehr hilfreich. Vielen Dank für die Freigabe dieses Codes! – Pavel

+0

Kein Problem, beachten Sie in meinem php Ich verwende keine vorbereiteten Aussagen. Wenn du diesen Produktionscode machen würdest, müsstest du das ein bisschen herumklopfen. – Aidanc

2

Die Antwort hängt davon ab, woher Ihre Marker kommen. Sind sie im Android-Gerät selbst gespeichert oder stammen sie von einem Webserver? In beiden Fällen müssen Sie, wenn Sie Tausende von Standorten gleichzeitig darstellen müssen, eine Art von Clustering implementieren, die auf dem Client oder auf dem Server ausgeführt werden kann, wenn Markierungen aus dem Internet stammen.

Siehe zum Beispiel des Server-Seite Clusterer (2 verschiedene Versionen):

http://maps.forum.nu/server_side_clusterer

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

oder ein Client-Seite Clusterer:

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

Eine weitere Alternative wäre sein, benutzerdefinierte Fliesen zu verwenden, (wie Google tut), aber abhängig von Ihre genauen Bedürfnisse können es übertrieben sein.

Verwandte Themen