在android中每100米后获取沿路线的lat / lng点数

时间:2015-10-26 12:51:36

标签: android google-maps google-maps-api-3

使用Map Api V2我在地图上画了一条路线。现在我想在我的数据库中保存这条路线。

所以我需要在每100米后获得路线上的lat / lng点,我将保存为多边形。我怎么能在Android中的Google Map V2中做到这一点。

我在过去10天内坚持使用但没有得到解决方案。 任何帮助都是适合的:)

public class NavigationActivity extends FragmentActivity  {
    public static final String TAG_SLAT = "sourcelat";
    public static final String TAG_SLONG = "sourcelong";
    public static final String TAG_DLAT = "destinationlat";
    public static final String TAG_DLONG = "destinationg";

    private static LatLng Source = null;
    private static LatLng Destination = null;

    private GoogleMap map;
    private SupportMapFragment fragment;
    private LatLngBounds latlngBounds;
    private Button bNavigation;
    private Polyline newPolyline;
    private Marker smarker;
    private  Marker dmarker;
    Geocoder geocoder;

    private boolean isTraveling = false;
    private int width, height;
    private String sourcelat;
    private String sourcelong;
    private String destinationg;
    private String destinationlat;
    double slat;
    double slong;
    double dlat;
    double dlong;
    double d;
    double tempDistance;
    String distance;
    ConnectionDetector cd;
    Boolean isConnectingToInternet = false;
    String ts;
    LatLng latLng;
    GPSTracker gps;

    List<Address> addresses;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!isGooglePlayServicesAvailable()) {
            finish();
        }
        setContentView(R.layout.activity_navigation);
        cd = new ConnectionDetector(getApplicationContext());
        isConnectingToInternet = cd.isConnectingToInternet();
        if (isConnectingToInternet) {
            Intent in = getIntent();
            sourcelat = in.getStringExtra(TAG_SLAT);
            destinationlat = in.getStringExtra(TAG_DLAT);
            destinationg = in.getStringExtra(TAG_DLONG);
            sourcelong = in.getStringExtra(TAG_SLONG);


            slat = Double.parseDouble(sourcelat);
            slong = Double.parseDouble(sourcelong);
            dlat = Double.parseDouble(destinationlat);
            dlong = Double.parseDouble(destinationg);
            Source = new LatLng(slat, slong);
            Destination = new LatLng(dlat, dlong);

            getSreenDimanstions();

            fragment = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map));
            map = fragment.getMap();
            map.setMyLocationEnabled(true);
            map.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
            map.setTrafficEnabled(true);

            ImageButton cureent_location = (ImageButton) findViewById(R.id.clocation);
            cureent_location.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    onLocationChanged();
                }
            });

            if (!isTraveling) {
                isTraveling = true;


                findDirections(Source.latitude, Source.longitude, Destination.latitude, Destination.longitude, GMapV2Direction.MODE_DRIVING);


            } else {
                isTraveling = false;

            }
        }else {
            AlertUtils.showAlertDialog(NavigationActivity.this, "No Internet Detected", "Please check your internet connection.", false);
        }
    }
    public  double calculateDistance(double fromLatitude,double fromLongitude,double toLatitude,double toLongitude)
    {

        float results[] = new float[1];

        try {
            Location.distanceBetween(fromLatitude, fromLongitude, toLatitude, toLongitude, results);
        } catch (Exception e) {
            if (e != null)
                e.printStackTrace();
        }
        if (Source.equals(Destination)){
            distance="0";
        }
        else {
            int dist = (int) results[0];
            if (dist <= 0)
                return 0D;

            DecimalFormat decimalFormat = new DecimalFormat("#.##");
            results[0] /= 1000D;
            distance = decimalFormat.format(results[0]);
            double d = Double.parseDouble(distance);
            double speed = 40;
            double time = d / speed;
             ts = manual(time);
            Log.v("fdf", String.valueOf(ts));


        }
        return d;
    }
    private static String manual(double eta) {
        int hour = (int) eta;
        eta =  (eta - hour) * 60;
        int minutes = (int) eta;
        eta =  (eta - minutes) * 60;
        int seconds = (int) eta;
        eta =  (eta - seconds) * 1000;
        int ms = (int) eta;
        //Log.d("ffgfh", String.valueOf(eta));
        return String.format("%dHr %dMin ", hour, minutes);
    }
    @Override
    protected void onResume() {

        super.onResume();
        latlngBounds = createLatLngBoundsObject(Source, Destination);
        map.moveCamera(CameraUpdateFactory.newLatLngBounds(latlngBounds, width, height, 100));



    }

    public void handleGetDirectionsResult(ArrayList<LatLng> directionPoints) {
        PolylineOptions rectLine = new PolylineOptions().width(5).color(Color.RED);
        //MarkerOptions marker = new MarkerOptions().position(Source).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
        MarkerOptions marker1 = new MarkerOptions().position(Destination).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));


        for(int i = 0 ; i < directionPoints.size() ; i++)
        {          
            rectLine.add(directionPoints.get(i));


        }
        if (newPolyline != null)
        {

            newPolyline.remove();
        }
        newPolyline = map.addPolyline(rectLine);
        //smarker = map.addMarker(marker);
        dmarker = map.addMarker(marker1);
        if (isTraveling) {

            latlngBounds = createLatLngBoundsObject(Source, Destination);
            map.animateCamera(CameraUpdateFactory.newLatLngBounds(latlngBounds, width, height, 100));
            Dialog dialog_help = new Dialog(this);
            dialog_help .requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog_help.setContentView(R.layout.title_multi_selectitems_dialog);

            calculateDistance(slat, slong, dlat, dlong);
            TextView dis = (TextView) dialog_help.findViewById(R.id.distance);
            dis.setText("Distance   " + distance + "Km   ");
            TextView tim = (TextView) dialog_help.findViewById(R.id.time);
            tim.setText("Time          " + ts);
            dialog_help.setCancelable(true);
            dialog_help.setTitle("Distance & Time" );

            dialog_help.setCanceledOnTouchOutside(true);
            dialog_help.show();

            dialog_help.getWindow().setGravity(Gravity.CENTER);
            dialog_help.getWindow().setBackgroundDrawable(new ColorDrawable(Color.LTGRAY));
            dialog_help.getWindow().setLayout(RadioGroup.LayoutParams.WRAP_CONTENT, RadioGroup.LayoutParams.WRAP_CONTENT);
        }
        else {

            map.animateCamera(CameraUpdateFactory.newLatLngBounds(latlngBounds, width, height, 100));
        }

    }

    private void getSreenDimanstions()
    {
        Display display = getWindowManager().getDefaultDisplay();
        width = display.getWidth(); 
        height = display.getHeight(); 
    }

    private LatLngBounds createLatLngBoundsObject(LatLng firstLocation, LatLng secondLocation)
    {
        if (firstLocation != null && secondLocation != null)
        {
            LatLngBounds.Builder builder = new LatLngBounds.Builder();
            builder.include(firstLocation).include(secondLocation);

            return builder.build();
        }
        return null;
    }



    public void findDirections(double fromPositionDoubleLat, double fromPositionDoubleLong, double toPositionDoubleLat, double toPositionDoubleLong, String mode)
    {
        Map<String, String> map = new HashMap<String, String>();
        map.put(GetDirectionsAsyncTask.USER_CURRENT_LAT, String.valueOf(fromPositionDoubleLat));
        map.put(GetDirectionsAsyncTask.USER_CURRENT_LONG, String.valueOf(fromPositionDoubleLong));
        map.put(GetDirectionsAsyncTask.DESTINATION_LAT, String.valueOf(toPositionDoubleLat));
        map.put(GetDirectionsAsyncTask.DESTINATION_LONG, String.valueOf(toPositionDoubleLong));
        map.put(GetDirectionsAsyncTask.DIRECTIONS_MODE, mode);

            GetDirectionsAsyncTask asyncTask = new GetDirectionsAsyncTask(this);


            try {
                asyncTask.execute(map);

            }catch (Exception e){
                Toast.makeText(getBaseContext(), "Something went Wrong", Toast.LENGTH_SHORT).show();
            }


    }


    public void onLocationChanged( ){
        TextView cl = (TextView) findViewById(R.id.latlongLocation);
        cd = new ConnectionDetector(getApplicationContext());
        isConnectingToInternet = cd.isConnectingToInternet();
        if (isConnectingToInternet) {
            gps = new GPSTracker(NavigationActivity.this);
            double latitude = gps.getLatitude();
            double longitude = gps.getLongitude();
             latLng = new LatLng(latitude, longitude);


            geocoder = new Geocoder(this, Locale.getDefault());

            try {
                addresses = geocoder.getFromLocation(latitude, longitude, 1);
            } catch (IOException e) {
                e.printStackTrace();
            }

            String address = addresses.get(0).getAddressLine(0);
            String prmises = addresses.get(0).getAddressLine(1);
            String city = addresses.get(0).getAddressLine(2);
            String country = addresses.get(0).getAddressLine(3);
            cl.setText(address + " " + prmises + " " + city + " " + country);
        }else {
            AlertUtils.showAlertDialog(NavigationActivity.this, "No Internet Detected", "Please check your internet connection.", false);
        }
    }





    private boolean isGooglePlayServicesAvailable() {
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (ConnectionResult.SUCCESS == status) {
            return true;
        } else {
            GooglePlayServicesUtil.getErrorDialog(status, this, 0).show();
            return false;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可以使用此地图应用程序尝试:http://maps.cloudmade.com/

首先,您使用航点创建路线。点击按钮&#34;获取路线&#34; (左上角)并创建您的路线(点击地图)。之后,您可以将您的路线(包括航路点)导出(右上角有一个按钮)到gpx或json文件。您可以将这两个文件加载到GIS中。