2016-07-26 2 views
0

따라야 할 방법이없는 현재 위치와 마커 사이의 경로를 만들고 싶습니다. 지도에 표식을 추가했지만 폴리선이 표시되지 않습니다. 예를 들어 사용자가 앱을 시작하면 자신의 위치에서 마커까지의 경로를 가져야합니다.현재 위치와 고정 마커 사이의 경로를 폴리선으로 만들 수 없습니다.

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, 
GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, 
    LocationListener { 

     private GoogleMap mMap; 
     ArrayList <LatLng> MarkerPoints; 
     GoogleApiClient mGoogleApiClient; 
     Location mLastLocation; 
     Marker mCurrLocationMarker; 
     LocationRequest mLocationRequest; 

     @ 
     Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_maps); 

      if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       checkLocationPermission(); 
      } 
      // Initializing 
      MarkerPoints = new ArrayList < >(); 

      // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
      SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
      mapFragment.getMapAsync(this); 
     } 

     /** 
      * Manipulates the map once available. 
      * This callback is triggered when the map is ready to be used. 
      * This is where we can add markers or lines, add listeners or move the camera. In this case, 
      * we just add a marker near Sydney, Australia. 
      * If Google Play services is not installed on the device, the user will be prompted to install 
      * it inside the SupportMapFragment. This method will only be triggered once the user has 
      * installed Google Play services and returned to the app. 
      */ 
     @ 
     Override 
     public void onMapReady(GoogleMap googleMap) { 
      mMap = googleMap; 

      //Initialize Google Play Services 
      if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       if (ContextCompat.checkSelfPermission(this, 
         Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
        buildGoogleApiClient(); 
        mMap.setMyLocationEnabled(true); 
       } 
      } else { 
       buildGoogleApiClient(); 
       mMap.setMyLocationEnabled(true); 

       mMap.addMarker(new MarkerOptions().position(new LatLng(34.701466, 33.029269)).title("UMAR")); 
       // Already two locations 
       if (MarkerPoints.size() > 1) { 
        MarkerPoints.clear(); 
        mMap.clear(); 
       } 
      } 

      // Setting onclick event listener for the map 
      mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 

       @ 
       Override 
       public void onMapClick(LatLng point) { 


        // Adding new item to the ArrayList 
        MarkerPoints.add(point); 

        // Creating MarkerOptions 
        MarkerOptions options = new MarkerOptions(); 

        // Setting the position of the marker 
        options.position(point); 

        /** 
         * For the start location, the color of marker is GREEN and 
         * for the end location, the color of marker is RED. 
         */ 
        if (MarkerPoints.size() == 1) { 
         options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); 
        } else if (MarkerPoints.size() == 2) { 
         options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); 
        } 


        // Checks, whether start and end locations are captured 
        if (MarkerPoints.size() >= 2) { 
         LatLng origin = MarkerPoints.get(0); 
         LatLng dest = MarkerPoints.get(1); 

         // Getting URL to the Google Directions API 
         String url = getUrl(origin, dest); 
         Log.d("onMapClick", url.toString()); 
         FetchUrl FetchUrl = new FetchUrl(); 

         // Start downloading json data from Google Directions API 
         FetchUrl.execute(url); 
         //move map camera 
         mMap.moveCamera(CameraUpdateFactory.newLatLng(origin)); 
         mMap.animateCamera(CameraUpdateFactory.zoomTo(11)); 
        } 

       } 
      }); 

     } 

     private String getUrl(LatLng origin, LatLng dest) { 

      // Origin of route 
      String str_origin = "origin=" + origin.latitude + "," + origin.longitude; 

      // Destination of route 
      String str_dest = "destination=" + dest.latitude + "," + dest.longitude; 


      // Sensor enabled 
      String sensor = "sensor=false"; 

      // Building the parameters to the web service 
      String parameters = str_origin + "&" + str_dest + "&" + sensor; 

      // Output format 
      String output = "json"; 

      // Building the url to the web service 
      String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters; 


      return url; 
     } 

     /** 
      * A method to download json data from url 
      */ 
     private String downloadUrl(String strUrl) throws IOException { 
      String data = ""; 
      InputStream iStream = null; 
      HttpURLConnection urlConnection = null; 
      try { 
       URL url = new URL(strUrl); 

       // Creating an http connection to communicate with url 
       urlConnection = (HttpURLConnection) url.openConnection(); 

       // Connecting to url 
       urlConnection.connect(); 

       // Reading data from url 
       iStream = urlConnection.getInputStream(); 

       BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 

       StringBuffer sb = new StringBuffer(); 

       String line = ""; 
       while ((line = br.readLine()) != null) { 
        sb.append(line); 
       } 

       data = sb.toString(); 
       Log.d("downloadUrl", data.toString()); 
       br.close(); 

      } catch (Exception e) { 
       Log.d("Exception", e.toString()); 
      } finally { 
       iStream.close(); 
       urlConnection.disconnect(); 
      } 
      return data; 
     } 

     // Fetches data from url passed 
     private class FetchUrl extends AsyncTask < String, Void, String > { 

      @ 
      Override 
      protected String doInBackground(String...url) { 

       // For storing data from web service 
       String data = ""; 

       try { 
        // Fetching the data from web service 
        data = downloadUrl(url[0]); 
        Log.d("Background Task data", data.toString()); 
       } catch (Exception e) { 
        Log.d("Background Task", e.toString()); 
       } 
       return data; 
      } 

      @ 
      Override 
      protected void onPostExecute(String result) { 
       super.onPostExecute(result); 

       ParserTask parserTask = new ParserTask(); 

       // Invokes the thread for parsing the JSON data 
       parserTask.execute(result); 

      } 
     } 

     /** 
      * A class to parse the Google Places in JSON format 
      */ 
     private class ParserTask extends AsyncTask < String, Integer, List < List < HashMap < String, String >>> > { 

      // Parsing the data in non-ui thread 
      @ 
      Override 
      protected List < List < HashMap < String, String >>> doInBackground(String...jsonData) { 

       JSONObject jObject; 
       List < List < HashMap < String, String >>> routes = null; 

       try { 
        jObject = new JSONObject(jsonData[0]); 
        Log.d("ParserTask", jsonData[0].toString()); 
        DataParser parser = new DataParser(); 
        Log.d("ParserTask", parser.toString()); 

        // Starts parsing data 
        routes = parser.parse(jObject); 
        Log.d("ParserTask", "Executing routes"); 
        Log.d("ParserTask", routes.toString()); 

       } catch (Exception e) { 
        Log.d("ParserTask", e.toString()); 
        e.printStackTrace(); 
       } 
       return routes; 
      } 

      // Executes in UI thread, after the parsing process 
      @ 
      Override 
      protected void onPostExecute(List < List < HashMap < String, String >>> result) { 
       ArrayList <LatLng> points; 
       PolylineOptions lineOptions = null; 

       // Traversing through all the routes 
       for (int i = 0; i < result.size(); i++) { 
        points = new ArrayList < >(); 
        lineOptions = new PolylineOptions(); 

        // Fetching i-th route 
        List < HashMap < String, String >> path = result.get(i); 

        // Fetching all the points in i-th route 
        for (int j = 0; j < path.size(); j++) { 
         HashMap < String, String > point = path.get(j); 

         double lat = Double.parseDouble(point.get("lat")); 
         double lng = Double.parseDouble(point.get("lng")); 
         LatLng position = new LatLng(lat, lng); 

         points.add(position); 
        } 

        // Adding all the points in the route to LineOptions 
        lineOptions.addAll(points); 
        lineOptions.width(10); 
        lineOptions.color(Color.RED); 

        Log.d("onPostExecute", "onPostExecute lineoptions decoded"); 

       } 

       // Drawing polyline in the Google Map for the i-th route 
       if (lineOptions != null) { 
        mMap.addPolyline(lineOptions); 
       } else { 
        Log.d("onPostExecute", "without Polylines drawn"); 
       } 
      } 
     } 

     protected synchronized void buildGoogleApiClient() { 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
      mGoogleApiClient.connect(); 
     } 

     @ 
     Override 
     public void onConnected(Bundle bundle) { 

      mLocationRequest = new LocationRequest(); 
      mLocationRequest.setInterval(1000); 
      mLocationRequest.setFastestInterval(1000); 
      mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
      if (ContextCompat.checkSelfPermission(this, 
        Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
       LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
      } 

     } 

     @ 
     Override 
     public void onConnectionSuspended(int i) { 

     } 

     @ 
     Override 
     public void onLocationChanged(Location location) { 

      mLastLocation = location; 
      if (mCurrLocationMarker != null) { 
       mCurrLocationMarker.remove(); 
      } 

      //Place current location marker 
      LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
      MarkerOptions markerOptions = new MarkerOptions(); 
      markerOptions.position(latLng); 
      markerOptions.title("Current Position"); 
      markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
      mCurrLocationMarker = mMap.addMarker(markerOptions); 

      //move map camera 
      mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
      mMap.animateCamera(CameraUpdateFactory.zoomTo(11)); 

      //stop location updates 
      if (mGoogleApiClient != null) { 
       LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
      } 

     } 

     @ 
     Override 
     public void onConnectionFailed(ConnectionResult connectionResult) { 

     } 

     public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 
     public boolean checkLocationPermission() { 
      if (ContextCompat.checkSelfPermission(this, 
        Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

       // Asking user if explanation is needed 
       if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
         Manifest.permission.ACCESS_FINE_LOCATION)) { 

        // Show an explanation to the user *asynchronously* -- don't block 
        // this thread waiting for the user's response! After the user 
        // sees the explanation, try again to request the permission. 

        //Prompt the user once explanation has been shown 
        ActivityCompat.requestPermissions(this, 
         new String[] { 
          Manifest.permission.ACCESS_FINE_LOCATION 
         }, 
         MY_PERMISSIONS_REQUEST_LOCATION); 


       } else { 
        // No explanation needed, we can request the permission. 
        ActivityCompat.requestPermissions(this, 
         new String[] { 
          Manifest.permission.ACCESS_FINE_LOCATION 
         }, 
         MY_PERMISSIONS_REQUEST_LOCATION); 
       } 
       return false; 
      } else { 
       return true; 
      } 
     } 

     @ 
     Override 
     public void onRequestPermissionsResult(int requestCode, 
      String permissions[], int[] grantResults) { 
      switch (requestCode) { 
       case MY_PERMISSIONS_REQUEST_LOCATION: 
        { 
         // If request is cancelled, the result arrays are empty. 
         if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

          // permission was granted. Do the 
          // contacts-related task you need to do. 
          if (ContextCompat.checkSelfPermission(this, 
            Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 

           if (mGoogleApiClient == null) { 
            buildGoogleApiClient(); 
           } 
           mMap.setMyLocationEnabled(true); 
          } 

         } else { 

          // Permission denied, Disable the functionality that depends on this permission. 
          Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); 
         } 
         return; 
        } 


      } 
     } 
    } 
+0

plz 위의 코드를 사용하여 정적 2 개의 lat-logn 패스 및 드로잉 폴리선을 검사하거나 작동하지 않는지 확인하십시오. – dipali

+0

나는 그것을 얻지 않았다. 두 개의 정적 변수를 lat와 long으로 만들어야하고 코드에있는 코드를 사용하여 폴리 라인을 그립니까? –

답변

0

tutorial을 살펴보십시오. 두 점 사이에 경로지도를 그리는 방법, 거리와 이동 시간을 계산하는 방법을 보여줍니다.

public class DirectionsJSONParser { 

    /** Receives a JSONObject and returns a list of lists containing latitude and longitude */ 
    public List<List<HashMap<String,String>>> parse(JSONObject jObject){ 

     List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String,String>>>() ; 
     JSONArray jRoutes = null; 
     JSONArray jLegs = null; 
     JSONArray jSteps = null; 

     try { 

      jRoutes = jObject.getJSONArray("routes"); 

      /** Traversing all routes */ 
      for(int i=0;i<jRoutes.length();i++){ 
       jLegs = ((JSONObject)jRoutes.get(i)).getJSONArray("legs"); 
       List path = new ArrayList<HashMap<String, String>>(); 

       /** Traversing all legs */ 
       for(int j=0;j<jLegs.length();j++){ 
        jSteps = ((JSONObject)jLegs.get(j)).getJSONArray("steps"); 

        /** Traversing all steps */ 
        for(int k=0;k<jSteps.length();k++){ 
         String polyline = ""; 
         polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get("polyline")).get("points"); 
         List<LatLng> list = decodePoly(polyline); 

         /** Traversing all points */ 
         for(int l=0;l<list.size();l++){ 
          HashMap<String, String> hm = new HashMap<String, String>(); 
          hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude)); 
          hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude)); 
          path.add(hm); 
         } 
        } 
       routes.add(path); 
      } 
     } 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    }catch (Exception e){ 
    } 

    return routes; 
    } 
    /** 
    * Method to decode polyline points 
    * Courtesy : http://jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java 
    * */ 
    private List<LatLng> decodePoly(String encoded) { 

     List<LatLng> poly = new ArrayList<LatLng>(); 
     int index = 0, len = encoded.length(); 
     int lat = 0, lng = 0; 

     while (index < len) { 
      int b, shift = 0, result = 0; 
      do { 
       b = encoded.charAt(index++) - 63; 
       result |= (b & 0x1f) << shift; 
       shift += 5; 
      } while (b >= 0x20); 
      int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
      lat += dlat; 

      shift = 0; 
      result = 0; 
      do { 
       b = encoded.charAt(index++) - 63; 
       result |= (b & 0x1f) << shift; 
       shift += 5; 
      } while (b >= 0x20); 
      int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
      lng += dlng; 

      LatLng p = new LatLng((((double) lat/1E5)), 
       (((double) lng/1E5))); 
      poly.add(p); 
     } 

     return poly; 
    } 
} 
MainActivity.Java 

public class MainActivity extends FragmentActivity { 

GoogleMap map; 
ArrayList<LatLng> markerPoints; 
TextView tvDistanceDuration; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    tvDistanceDuration = (TextView) findViewById(R.id.tv_distance_time); 

    // Initializing 
    markerPoints = new ArrayList<LatLng>(); 

    // Getting reference to SupportMapFragment of the activity_main 
    SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 

    // Getting Map for the SupportMapFragment 
    map = fm.getMap(); 

    // Enable MyLocation Button in the Map 
    map.setMyLocationEnabled(true); 

    // Setting onclick event listener for the map 
    map.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 

     @Override 
     public void onMapClick(LatLng point) { 

      // Already two locations 
      if (markerPoints.size() > 1) { 
       markerPoints.clear(); 
       map.clear(); 
      } 

      // Adding new item to the ArrayList 
      markerPoints.add(point); 

      // Creating MarkerOptions 
      MarkerOptions options = new MarkerOptions(); 

      // Setting the position of the marker 
      options.position(point); 

      /** 
      * For the start location, the color of marker is GREEN and 
      * for the end location, the color of marker is RED. 
      */ 
      if (markerPoints.size() == 1) { 
       options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); 
      } else if (markerPoints.size() == 2) { 
       options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); 
      } 

      // Add new marker to the Google Map Android API V2 
      map.addMarker(options); 

      // Checks, whether start and end locations are captured 
      if (markerPoints.size() >= 2) { 
       LatLng origin = markerPoints.get(0); 
       LatLng dest = markerPoints.get(1); 

       // Getting URL to the Google Directions API 
       String url = getDirectionsUrl(origin, dest); 

       DownloadTask downloadTask = new DownloadTask(); 

       // Start downloading json data from Google Directions API 
       downloadTask.execute(url); 
      } 
     } 
    }); 
} 

private String getDirectionsUrl(LatLng origin, LatLng dest) { 

    // Origin of route 
    String str_origin = "origin=" + origin.latitude + "," + origin.longitude; 

    // Destination of route 
    String str_dest = "destination=" + dest.latitude + "," + dest.longitude; 

    // Sensor enabled 
    String sensor = "sensor=false"; 

    // Building the parameters to the web service 
    String parameters = str_origin + "&" + str_dest + "&" + sensor; 

    // Output format 
    String output = "json"; 

    // Building the url to the web service 
    String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters; 

    return url; 
} 

/** 
* A method to download json data from url 
*/ 
private String downloadUrl(String strUrl) throws IOException { 
    String data = ""; 
    InputStream iStream = null; 
    HttpURLConnection urlConnection = null; 
    try { 
     URL url = new URL(strUrl); 

     // Creating an http connection to communicate with url 
     urlConnection = (HttpURLConnection) url.openConnection(); 

     // Connecting to url 
     urlConnection.connect(); 

     // Reading data from url 
     iStream = urlConnection.getInputStream(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 

     StringBuffer sb = new StringBuffer(); 

     String line = ""; 
     while ((line = br.readLine()) != null) { 
      sb.append(line); 
     } 

     data = sb.toString(); 

     br.close(); 

    } catch (Exception e) { 
     Log.d("Exception while downloading url", e.toString()); 
    } finally { 
     iStream.close(); 
     urlConnection.disconnect(); 
    } 
    return data; 
} 

// Fetches data from url passed 
private class DownloadTask extends AsyncTask<String, Void, String> { 

    // Downloading data in non-ui thread 
    @Override 
    protected String doInBackground(String... url) { 

     // For storing data from web service 
     String data = ""; 

     try { 
      // Fetching the data from web service 
      data = downloadUrl(url[0]); 
     } catch (Exception e) { 
      Log.d("Background Task", e.toString()); 
     } 
     return data; 
    } 

    // Executes in UI thread, after the execution of 
    // doInBackground() 
    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     ParserTask parserTask = new ParserTask(); 

     // Invokes the thread for parsing the JSON data 
     parserTask.execute(result); 
    } 
} 

/** 
* A class to parse the Google Places in JSON format 
*/ 
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> { 

    // Parsing the data in non-ui thread 
    @Override 
    protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) { 

     JSONObject jObject; 
     List<List<HashMap<String, String>>> routes = null; 

     try { 
      jObject = new JSONObject(jsonData[0]); 
      DirectionsJSONParser parser = new DirectionsJSONParser(); 

      // Starts parsing data 
      routes = parser.parse(jObject); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return routes; 
    } 

    // Executes in UI thread, after the parsing process 
    @Override 
    protected void onPostExecute(List<List<HashMap<String, String>>> result) { 
     ArrayList<LatLng> points = null; 
     PolylineOptions lineOptions = null; 
     MarkerOptions markerOptions = new MarkerOptions(); 
     String distance = ""; 
     String duration = ""; 

     if (result.size() < 1) { 
      Toast.makeText(getBaseContext(), "No Points", Toast.LENGTH_SHORT).show(); 
      return; 
     } 

     // Traversing through all the routes 
     for (int i = 0; i < result.size(); i++) { 
      points = new ArrayList<LatLng>(); 
      lineOptions = new PolylineOptions(); 

      // Fetching i-th route 
      List<HashMap<String, String>> path = result.get(i); 

      // Fetching all the points in i-th route 
      for (int j = 0; j < path.size(); j++) { 
       HashMap<String, String> point = path.get(j); 

       if (j == 0) { // Get distance from the list 
        distance = (String) point.get("distance"); 
        continue; 
       } else if (j == 1) { // Get duration from the list 
        duration = (String) point.get("duration"); 
        continue; 
       } 

       double lat = Double.parseDouble(point.get("lat")); 
       double lng = Double.parseDouble(point.get("lng")); 
       LatLng position = new LatLng(lat, lng); 

       points.add(position); 
      } 

      // Adding all the points in the route to LineOptions 
      lineOptions.addAll(points); 
      lineOptions.width(2); 
      lineOptions.color(Color.RED); 
     } 

     tvDistanceDuration.setText("Distance:" + distance + ", Duration:" + duration); 

     // Drawing polyline in the Google Map for the i-th route 
     map.addPolyline(lineOptions); 
    } 
} 

확인하십시오. link. 이 thread의 질문을 참조 할 수도 있습니다.

+0

이전에이 자습서를 확인했지만 getmapAsync 대신 이전 버전 인 getmap()을 사용하고 있습니다. 그런 식으로하는 방법을 모릅니다! –

관련 문제