2017-05-04 22 views
2

如果藍點是當前位置,如何獲取方向到圓圈外最近的位置?如何獲取Google地圖android中當前位置在2個或更多圈內的最短路徑外圈的方向?

1 [enter image description here1

以及如何顯示只有大約半徑2000米當前位置標記?我已將映射lanslide存儲在數據庫中,並顯示應用何時啓動,並且需要7-9秒來加載這些標記。現在我只需要在當前位置附近展示,以便應用順利進行。

enter image description here

[這些都是lanslide的映射點]

即時通訊做我的最後謨,我有一個功能,它真的很難。

在我的android項目上,在android上做出關於lanslide災難的警告應用程序,我做了lanslide位置的映射點,並收集了大約150對經度和經度,並將其放在數據庫上。

我想如果一個圓圈內的用戶,他們在lanslide位置,他們是不是安全

紅色區域半徑是從圓心2KM。 橙色區域半徑距離圓心1km。 黃色區域半徑距離圓心500米

當應用程序啓動時,地圖會顯示並將相機設置爲我當前位置的動畫。 ,然後應用程序會告訴用戶他們是否安全。 如果用戶在圈外,那麼用戶是安全的。但是, 如果當前位置在圈內,那麼用戶是不安全的。 當用戶不安全時,APP會給出圓圈外最短路徑的指示。

我的應用程序幾乎做到了,除了最後一個功能,我出去的想法如何計算出來的,

如何APP可以給你的最短路徑之外的圓圈方向?

不幸的是,如果CURRENT LOCATION在3或更多的圈內,應用程序如何才能獲得用戶最短外圈的方向?以及我可以用來解決這個問題的谷歌搜索引擎?

如何獲得多方向的方向?請幫幫我。

enter image description here

這是我的代碼:

公共類MenuMaps擴展片段實現OnMapReadyCallback { 私有靜態MenuMaps例如= NULL;

private SupportMapFragment sMapFragment; 
private MapView mMapView; 
SupportMapFragment mapFragment; 
private GoogleMap mMap; 
private String[] id, desa, status_des; 
    boolean markerD[]; 
private Double latitude, longitude; 
private Circle mCircle; 
private Marker mMarker; 
LatLng lokasisekarang; 


boolean mapReady = false; 

private GoogleApiClient client; 

private GoogleApiClient client2; 

public static MenuMaps getInstance() { 
    if (instance == null) { 
     instance = new MenuMaps(); 
     Log.d("MenuMaps", "getInstance"); 
    } 
    return instance; 
} 



@Nullable 
@Override 

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 


{ 
    Log.d("MenuMaps", "OnCreateView"); 
    View inflatedView = inflater.inflate(R.layout.menu_maps, container, false); 

    MapsInitializer.initialize(getActivity()); 

    mMapView = (MapView) inflatedView.findViewById(R.id.map); 
    mMapView.onCreate(savedInstanceState); 

    mMapView.getMapAsync(this); 


     Button btnMap = (Button) inflatedView.findViewById(R.id.btnMap); 
    btnMap.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mapReady) 
       mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 

     } 
    }) ; 


    Button btnSatellite = (Button) inflatedView.findViewById(R.id.btnSatellite); 
    btnSatellite.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mapReady) 
       mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
     } 
    }); 

    Button btnHybrid = (Button) inflatedView.findViewById(R.id.btnHybrid); 
    btnHybrid.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(mapReady) 
       mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     } 
    }); 

    return inflatedView; 
} 

@Override 

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    getActivity().setTitle("Menu Maps"); 
} 


@Override 
public void onStart() { 
    super.onStart(); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
} 

@Override 
public void onResume() { 
    mMapView.onResume(); 
    super.onResume(); 
} 
@Override 
public void onPause() { 
    super.onPause(); 
    mMapView.onPause(); 
} 
@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mMapView.onDestroy(); 
} 
@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
    mMapView.onLowMemory(); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 


} 


public void getLokasi() { 
    Log.d("desaStatus", "getLokasi"); 

    String url = "http://dharuelfshop.com/skripsi/desaStatus.php/"; 
    StringRequest request = new StringRequest(url, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.d("desaStatus", response); 
      Gson gson = new Gson(); 


      try { 
       JSONObject objinduk = new JSONObject(response); 
       List<DesaStatus> listDesaStatus = gson.fromJson(objinduk.getString("desaStatus"), new TypeToken<List<DesaStatus>>() { 
       }.getType()); 

       Circle circleTerdekat = null; 
       Float distanceTerdekat = null; 



       for (DesaStatus desaStatus : listDesaStatus 
         ) { 
        Log.d("desaStatus", desaStatus.toString()); 

        LatLng center = new LatLng(desaStatus.lat_bcn, 
          desaStatus.long_bcn); 

        MarkerOptions markerOptions = new MarkerOptions() 
          .position(center) 
          .title("Desa : " + desaStatus.nama_des) 
          .snippet("Status : " + desaStatus.jenis_status) 
          .icon(BitmapDescriptorFactory 
            .defaultMarker(desaStatus.kode_warna)); 
        mMarker = mMap.addMarker(markerOptions); 

        CircleOptions CircleOptions = new CircleOptions() 
          .center(center) 
          .radius(desaStatus.radius)//in meters 
          .strokeColor(Color.parseColor(desaStatus.warna_radius)) 
          .strokeWidth(2) 
          .fillColor(Color.parseColor(desaStatus.warna_radius)); 
        mCircle = mMap.addCircle(CircleOptions); 

        //hitung distance dan Status circle 
        float[] distance = new float[2]; 

        Location.distanceBetween(lokasisekarang.latitude, lokasisekarang.longitude, 
          mCircle.getCenter().latitude, mCircle.getCenter().longitude, distance); 

        if (circleTerdekat == null) { 
         circleTerdekat = mCircle; 
         distanceTerdekat = distance[0]; 

        } else { 
         if (distance[0] < distanceTerdekat) { 
          distanceTerdekat = distance[0]; 
          circleTerdekat = mCircle; 
         } 
        } 

       } 
       Log.d("circleTerdekat", "center: " + circleTerdekat.getCenter().latitude + " " + circleTerdekat.getCenter().longitude); 

       if(distanceTerdekat > circleTerdekat.getRadius()){ 
        Toast.makeText(getContext(), "You are safe, distance from center: " + distanceTerdekat + " radius: " + circleTerdekat.getRadius(), Toast.LENGTH_LONG).show(); 
       } else { 
        Toast.makeText(getContext(), "You are not safe, distance from center: " + distanceTerdekat + " radius: " + circleTerdekat.getRadius() , Toast.LENGTH_LONG).show(); 
       } 

      } catch (JSONException error) { 
       Log.d("desaStatusError", error.toString()); 
      } 
      } 
     } 
    }, new Response.ErrorListener() { 


     @Override 
     public void onErrorResponse(VolleyError error) { 

      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
      builder.setTitle("Error woy"); 
      //Message 
      builder.setMessage("Error " + error); //+ error diganti sama (VolleyError error) 
      //Message 

      //builder.setIcon() 
      builder.setPositiveButton("Refreshh", new DialogInterface.OnClickListener() { 
       @Override //O nya huruf gede 
       public void onClick(DialogInterface dialog, int which) { 
        getLokasi(); 
       } 
      }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
     } 
    }); 

    // menambah request ke request queue 
    VolleyRequest.getInstance().addToRequestQueue(request); 
} 

public void getCurrentLocation() { 
    GpsTracker gps = new GpsTracker(getActivity()); 
    if (gps.canGetLocation()) { // gps enabled 
     //Getting longitude and latitude 
     latitude = gps.getLatitude(); 
     longitude = gps.getLongitude(); 

     lokasisekarang = new LatLng(latitude, longitude); 
     drawMarkerWithCircle(lokasisekarang); 

     mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(lokasisekarang, 14f)); 


     // \n is for new line 
     //Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show(); 
    } 

    else { 
     // can't get location 
     // GPS or Network is not enabled 
     // Ask user to enable GPS/network in settings 
     gps.showSettingsAlert(); 
     //gps.stopUsingGPS(); 
    } 
} 

private void drawMarkerWithCircle(LatLng lokasisekarang) { 
    MarkerOptions markerOptions = new MarkerOptions() 
      .position(lokasisekarang) 
      .title("You are here") 
      .snippet("here") 
      .icon(BitmapDescriptorFactory 
        .defaultMarker(HUE_BLUE)); 
    mMarker = mMap.addMarker(markerOptions); 

    CircleOptions circleOptions = new CircleOptions() 
      .center(lokasisekarang) 
      .radius(2000) 
      .strokeWidth(2) 
      .strokeColor(Color.BLUE) 
      .fillColor(Color.parseColor("#500084d3")); 

    mMap.addCircle(circleOptions); 
} 

@Override 
    public void onMapReady(GoogleMap googleMap) { 
    mapReady = true; 

    mMap = googleMap; 
    getCurrentLocation(); 
    getLokasi(); 
    if (ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     // TODO: Consider calling 
     // ActivityCompat#requestPermissions 
     // here to request the missing permissions, and then overriding 
     // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
     //           int[] grantResults) 
     // to handle the case where the user grants the permission. See the documentation 
     // for ActivityCompat#requestPermissions for more details. 
     return; 
    } 

    mMap.setMyLocationEnabled(true); 
    mMap.getUiSettings().setMyLocationButtonEnabled(true); // buat enable button location 

}} 
+0

此問題與IOS無關,請從問題中移除iOS標記。 –

回答

0

爲了顯示方向,你需要2點來源和目的地。這種情況下的來源將是您用戶的位置。

尋找目標點:

1)您正在存儲這些圓形區域的中心,其半徑(500米,1公里等)。除此之外,您還可以輕鬆計算每個圓圈沿4個方向(如N,S,E,W)的4個「安全」點並存儲它們。

2)這些點將你的圈子分成4個象限。現在,您只需找到用戶當前位置所在圓的哪個象限,然後比較形成象限的點之間的距離,並選擇兩者中較低的一個作爲目的地。

3)使用谷歌地圖Directions API顯示方向。

如果你想增加了算法的精確度,所有你需要做的是增加,這將有效地分配你的圈子到更多更小的部分和目標將更加優化方向的數量。

這裏'4'只是一個任意數字。您可以根據您選擇安全的點數有不同的號碼,將決定算法

編輯的準確性:處理多圓相交的也很容易。所有你需要做的是不是計算最短爲1米的圓你計算所有的圈子,其中點所在,然後找到最小距離

算法:

1)對於每一個圓圈選擇「N」安全點。這些'n'點將形成圈內的n - 1扇區。

2)獲取用戶的當前位置(比如說A)並找到所有區域的,包含了這一點的圓圈。

3)對於每一個圓圈其中PT A謊言,計算扇區在其中它位於。假設它位於由點X_iY_i組成的部門。計算距離AX_iAY_i

4)所有距離選擇最小AX_iAY_i並顯示有關這些點的導航指令

如果標記出現在視覺上相互接近沒關係..你不會在視覺上找到計算設備將要執行的方向。緯度/長度值無論如何都具有非常高的精度。

+0

感謝您的回答,但我怎麼能說這些'4'是半徑之外的最短位置?通過比較一個? –

+0

是的。實際上,不管你選擇多少方向,你只需要計算2點的距離。這些將是構成重點所在部門的要點。所有其他點都將在更大的距離 – akash93

+0

謝謝你,我是如此新的android編程,:(什麼谷歌地圖庫我可以用這個?或者我只需要一個距離之間的循環來計算當前位置到目的地點?? –

相關問題