2010-08-05 31 views
5

Tôi hiện đang phát triển một ứng dụng cho Android sử dụng dịch vụ bản đồ google. Bởi vì người dùng sẽ có thể thấy hàng nghìn điểm đánh dấu tôi muốn chỉ tải những người đang ở trong giới hạn bản đồ (tức là khi người dùng nhìn vào ô bản đồ cụ thể). Tôi biết làm thế nào để làm điều đó với javascript/html. Tuy nhiên, Android dường như không cung cấp bất kỳ phương thức tương tự nào như containsLatLng (latlng) hoặc getBounds (tôi chỉ tìm thấy getLatitudeSpan và getLongitudeSpan, nhưng không biết làm thế nào tôi có thể sử dụng chúng để đạt được hiệu ứng tương tự).Làm cách nào để tải các điểm đánh dấu động cho vị trí hiện tại trong bản đồ google của Android?

Có ai cho tôi một số gợi ý về điều đó không? Tôi sẽ đánh giá cao bất kỳ sự giúp đỡ hoặc ít nhất là chỉ mình vào đúng hướng.

Trả lời

7

Bạn có thể sử dụng getMapCenter và chỉ thêm hoặc trừ khoảng kinh độ hoặc kinh độ (chia cho 2 tất nhiên) để tìm các giới hạn.

+0

Cảm ơn bạn đã gợi ý Twaroog - nó hoạt động khá tốt. Tôi đã có thể di chuyển xa hơn với dự án của tôi một chút nhờ bạn. – Pavel

+0

Không vấn đề gì, tôi cũng làm như vậy trong dự án của mình. – LordTwaroog

2

Các dấu vị trí đó đến từ đâu? Nếu chúng đến từ một dịch vụ web, hãy kiểm tra xem dịch vụ web có hỗ trợ các truy vấn không gian. Nếu nó là một điểm cơ bản trong phạm vi (phong bì hình chữ nhật), bạn có thể làm một cái gì đó như thế này:

Lưu ý: (xmin, ymin -> xmax, ymax) là giới hạn của hình chữ nhật của bạn (mức độ).

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 

Đây là điều rất đơn giản. Thậm chí bạn có thể sử dụng API dữ liệu của Google Maps để lưu trữ các dấu vị trí của mình và có cơ chế để thực hiện các truy vấn không gian.

Nếu dữ liệu của bạn nằm trên Google App Engine, thì bạn có thể sử dụng truy vấn dựa trên GeoPt hoặc bạn có thể cuộn chỉ mục không gian của riêng mình. Hãy xem http://code.google.com/p/geomodel/

+0

Họ đang đến từ db sql địa phương tại thời điểm Rahul, nhưng trong tương lai tôi muốn mở rộng này để db từ xa là tốt. – Pavel

2

Tôi đang làm điều gì đó tương tự với chính mình nhưng tôi đang sử dụng máy chủ. Lý do tôi làm như vậy là vì lý do tính toán. Khi ứng dụng đầu tiên bắt đầu một yêu cầu HTTP được gửi đến một tập lệnh php có chứa một truy vấn MySQL. Kịch bản lệnh php thu thập các lat/long hiện tại của người dùng và trả về một JSON tất cả các điểm trong phạm vi 1KM của vị trí hiện tại. Sau đó, ứng dụng phân tích cú pháp JSON đó thành một cơ sở dữ liệu MySQL cục bộ và thực hiện các công cụ với nó.

Để gửi yêu cầu HTTP và phân tích cú pháp JSON thành một cơ sở dữ liệu tôi đang làm như sau ..

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

Để làm việc này tất cả bạn cần là một tập tin php ngắn mà mất Lat/lng Something như ...

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

Điều đó sẽ đưa vào giá trị và in kết quả bằng JSON.

// chỉnh sửa: Để nhận được lat/lng ở địa điểm đầu tiên, tôi đang sử dụng GPS.

Hy vọng điều này sẽ hữu ích.

+0

Aidanc thú vị. Điều này thực sự rất hữu ích. Cảm ơn bạn rất nhiều vì đã chia sẻ mã này! – Pavel

+0

Không có vấn đề, lưu ý trong php của tôi Tôi không sử dụng báo cáo chuẩn bị. Nếu bạn đã làm cho mã sản xuất này, bạn sẽ cần phải gõ đó xung quanh một chút. – Aidanc

2

Câu trả lời sẽ tùy thuộc vào nơi các điểm đánh dấu của bạn đến từ đâu. Chúng được lưu trữ trong chính thiết bị Android hay chúng đến từ một máy chủ web? Dù bằng cách nào, nếu bạn cần đại diện cho hàng nghìn vị trí đồng thời, bạn có thể cần triển khai một số dạng phân cụm, có thể được thực hiện trên máy khách hoặc trên máy chủ, nếu các dấu đến từ web.

Xem, ví dụ này phía máy chủ clusterer (2 phiên bản khác nhau):

http://maps.forum.nu/server_side_clusterer

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

hoặc một clusterer phía khách hàng:

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

Một thay thế sẽ sử dụng các lát tùy chỉnh, (giống như Google), nhưng tùy thuộc vào nhu cầu chính xác của bạn có thể là quá mức cần thiết.

Các vấn đề liên quan