2014-02-20 42 views
2

我一直在研究一個具有谷歌地圖的android應用程序,我要求座標到一個節點js服務器,然後將響應解析爲double類型,並在傳遞給對象時Marker標記出現在一個不準確的位置,我已經複製了數據庫中的座標,當我將它們直接傳遞給Marker的對象時,標記出現在正確的位置,我也有一個警告框顯示標記的值爲我從服務器收到它們,它似乎顯示正確的座標,我認爲是有一些垃圾值與我分配座標的變量,或者它可以是解析中的問題,而我得到他們的形式的JSON從服務器和解析他們加倍 我已經做了一些搜索,但我無法找到一個具體的解決方案解決我的問題,如果我沒有徹底,我很抱歉,先謝謝大家的幫助。谷歌地圖標記出現在地圖上的錯誤位置

下面是代碼: 的代碼時,我收到的座標和解析它們(通過socketIO):

public void on(String functionName, IOAcknowledge ioAck, Object... arguments) { 

       if("points_of_interest".equals(functionName)){ 

       temp=arguments[0].toString(); 
       try { 
        JSONObject object=new JSONObject(temp); 
        String idStop=object.getString("route_id"); 
        String longt=object.getString("stop_longg"); 
        String lat=object.getString("stop_lat"); 

        lati=Double.parseDouble(lat); 
        lngi=Double.parseDouble(longt); 



       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
           } 
          } 

現在,這裏是創建在onCreate方法標記的函數調用:

 map=((MapFragment) getFragmentManager().findFragmentById(R.id.allBusMaps)).getMap(); 


    createStops(); 

這裏是createStops代碼()方法:

 public void createStops(){ 

    map.clear(); 
// LatLng lhr=new LatLng(31.500794,74.316777); 
      LatLng lhr=new LatLng(lati,lngi); 



    Marker lahore = map.addMarker(new MarkerOptions().position(lhr).title("busStop")); 
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(lhr, 15)); 

} 

在上面提到的情況情況下,當我傳遞的值通過變量這是被生成的輸出:

但是,當我通過直接傳遞到標記的對象中的值顯示在右側的位置的標記:

eg LatLng lhr =新LatLng(31.500794,74.316777);

+0

你從json獲得lati,lngi變量的值是多少? – fargath

+0

主席先生,我用一個警告框來顯示lati,lngi變量的值,並且兩者分別顯示正確31.500794和74.316777 – Hassan

+0

我認爲問題出在解析 – Hassan

回答

0

我發現上述問題的解決方案,我有重複調試, 我注意到的問題是lati和lngi對象沒有得到它們各自的值在指定的時間間隔,直到這兩個對象仍然初始值分別爲0.0和0.0,因此在大多數測試嘗試中標記沒有出現在精確位置。 爲了克服這個問題,我在我調用createStops方法之前強制等待500毫秒,這使得lati和lngi對象有足夠的時間從服務器獲得它們各自的值。 這裏是我工作:

map=((MapFragment) getFragmentManager().findFragmentById(R.id.allBusMaps)).getMap(); 

    //new pointMarker().execute(); 
    try { 
     Thread.sleep(500); //a wait of 500 milliseconds 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    createStops(); // this is the method that creates the markers 

謝謝大家的幫助。