Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算行驶距离(而不是行驶距离)_Java_Android_Kotlin_Distance - Fatal编程技术网

Java 计算行驶距离(而不是行驶距离)

Java 计算行驶距离(而不是行驶距离),java,android,kotlin,distance,Java,Android,Kotlin,Distance,我需要计算汽车行驶的距离!不是距离,不是距离到否。如果我们通过谷歌提供的API计算,距离可能完全不同。谷歌可以提供从一个点到另一个点的1公里距离,但汽车可以按照骑手想要的方式行驶800米。使用加速计没有帮助。它适用于步行,但不适用于更快的速度 有没有关于如何计算汽车行驶距离的建议 我试过使用谷歌的定位API:distanceTo或distanceBetween根本不是一个选项。它可以给出与实际情况显著不同的结果。在现实生活中,汽车可以在很短的地方行驶,并在800米内到达目标,而谷歌可以给出位置之

我需要计算汽车行驶的距离!不是距离,不是距离到否。如果我们通过谷歌提供的API计算,距离可能完全不同。谷歌可以提供从一个点到另一个点的1公里距离,但汽车可以按照骑手想要的方式行驶800米。使用加速计没有帮助。它适用于步行,但不适用于更快的速度

有没有关于如何计算汽车行驶距离的建议

我试过使用谷歌的定位API:distanceTo或distanceBetween根本不是一个选项。它可以给出与实际情况显著不同的结果。在现实生活中,汽车可以在很短的地方行驶,并在800米内到达目标,而谷歌可以给出位置之间1公里的距离

下面是我的申请代码。速度惊人地正确

class HomeScreen : AppCompatActivity(), GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener, SensorEventListener {
    override fun onSensorChanged(event: SensorEvent?) {
        val sensor = event?.sensor
        val values = event?.values
        var value = -1

        if (values != null && values.size ?: 0 > 0) {
            value = values[0].toInt()
        }


        if (sensor != null &&
            sensor.type == Sensor.TYPE_STEP_DETECTOR
        ) {
            val finalSteps = getDistanceRun(steps)
            val finalStepsTruncated = String.format("%.2f", finalSteps)
            distanceTV.text = "$finalStepsTruncated"
            steps++
        }
    }

    override fun onAccuracyChanged(p0: Sensor?, p1: Int) {

    }

    override fun onConnectionFailed(p0: ConnectionResult) {
        val failed = p0
    }

    @SuppressLint("MissingPermission")
    override fun onConnected(p0: Bundle?) {
        if (locationPermissionsGranted(this)) {
            fusedLocationClient?.requestLocationUpdates(locationRequest, object : LocationCallback() {
                override fun onLocationResult(p0: LocationResult?) {
                    val location = p0
                    val metersPerSecond: Float = location?.lastLocation?.speed ?: 0f
                    val speed = metersPerSecond * 3600 / 1000
                    speedTV.text = "${Math.round(speed)} KM/H"
                }
            }, null)

        } else {
            requestPermission(
                this, 0,
                Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION
            )
        }
    }

    override fun onConnectionSuspended(p0: Int) {
        val suspended = p0
    }

    private var fusedLocationClient: FusedLocationProviderClient? = null
    private var mGoogleApiClient: GoogleApiClient? = null
    private lateinit var locationRequest: LocationRequest
    private var steps: Long = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home_screen)
        locationRequest = LocationRequest()
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY;
        locationRequest.interval = 1000
        locationRequest.fastestInterval = 500

        if (PermissionManager.locationPermissionsGranted(this)) {
            mGoogleApiClient = GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build()

            mGoogleApiClient?.connect()
            fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
            createLocationRequest()
        } else {
            requestPermission(
                this, 0,
                Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION
            )
        }

        val sManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        val stepSensor = sManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR)
        sManager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_FASTEST);
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (PermissionManager.locationPermissionsGranted(this)) {
            mGoogleApiClient = GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build()
            mGoogleApiClient?.connect()
            fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
            createLocationRequest()
        }
    }

    protected fun createLocationRequest() {
        val builder = LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest)

        val client = LocationServices.getSettingsClient(this)
        val task = client.checkLocationSettings(builder.build())

        task.addOnSuccessListener(this) {

            // All location settings are satisfied. The client can initialize
            // location requests here.
            // ...
        }

        task.addOnFailureListener(this) { e ->

            if (e is ResolvableApiException) {
                // Location settings are not satisfied, but this can be fixed
                // by showing the user a dialog.
                try {
                    // Show the dialog by calling startResolutionForResult(),
                    // and check the result in onActivityResult().
                    e.startResolutionForResult(
                        this@HomeScreen,
                        0
                    )
                } catch (sendEx: IntentSender.SendIntentException) {
                    // Ignore the error.
                }

            }
        }
    }

    fun getDistanceRun(steps: Long): Float {
        return (steps * 78).toFloat() / 100000.toFloat()
    }
}
class主屏幕:AppCompativeActivity(),GoogleAppClient.ConnectionCallbacks,
GoogleAppClient.OnConnectionFailedListener,SensorEventListener{
覆盖传感器更改的乐趣(事件:传感器事件?){
val传感器=事件?传感器
val值=事件?.值
var值=-1
如果(值!=null&&values.size?:0>0){
value=值[0].toInt()
}
如果(传感器)=空&&
sensor.type==sensor.type\u步进检测器
) {
val finalSteps=getDistanceRun(步骤)
val finalStepsTruncated=String.format(“%.2f”,finalSteps)
distanceTV.text=“$finalStepsTruncated”
台阶++
}
}
覆盖精度更改(p0:Sensor?,p1:Int){
}
覆盖连接失败(p0:ConnectionResult){
val失败=p0
}
@SuppressLint(“丢失许可”)
覆盖未连接的乐趣(p0:捆绑?){
如果(位置许可证声明(本)){
fusedLocationClient?.RequestLocationUpdate(locationRequest,对象:LocationCallback(){
覆盖趣味onLocationResult(p0:LocationResult?){
val位置=p0
val metersPerSecond:Float=位置?.lastLocation?.speed?:0f
val速度=米每秒*3600/1000
speedTV.text=“${Math.round(速度)}公里/小时”
}
},空)
}否则{
请求许可(
这个,0,,
Manifest.permission.ACCESS\u粗略位置,Manifest.permission.ACCESS\u精细位置
)
}
}
覆盖连接已暂停(p0:Int){
val=p0
}
私有变量fusedLocationClient:FusedLocationProviderClient?=null
私有变量mGoogleApiClient:GoogleApiClient?=null
私有lateinit var locationRequest:locationRequest
私有变量步骤:Long=0
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\u主屏幕)
locationRequest=locationRequest()
locationRequest.priority=locationRequest.priority\u高精度;
locationRequest.interval=1000
locationRequest.FastTestInterval=500
if(许可证经理位置许可证授权(本)){
mGoogleApiClient=GoogleApiClient.Builder(此)
.addConnectionCallbacks(此)
.addOnConnectionFailedListener(此)
.addApi(LocationServices.API)
.build()
mGoogleApiClient?.connect()
fusedLocationClient=LocationServices.getFusedLocationProviderClient(此)
createLocationRequest()
}否则{
请求许可(
这个,0,,
Manifest.permission.ACCESS\u粗略位置,Manifest.permission.ACCESS\u精细位置
)
}
val sManager=getSystemService(Context.SENSOR_服务)作为SensorManager
val stepSensor=sManager.getDefaultSensor(传感器类型\u STEP\u检测器)
sManager.registerListener(此、stepSensor、SensorManager.SENSOR\u DELAY\u faster);
}
重写onRequestPermissionsResult(请求代码:Int,权限:Array,GrantResult:IntArray){
super.onRequestPermissionsResult(请求代码、权限、GrantResult)
if(许可证经理位置许可证授权(本)){
mGoogleApiClient=GoogleApiClient.Builder(此)
.addConnectionCallbacks(此)
.addOnConnectionFailedListener(此)
.addApi(LocationServices.API)
.build()
mGoogleApiClient?.connect()
fusedLocationClient=LocationServices.getFusedLocationProviderClient(此)
createLocationRequest()
}
}
受保护的fun createLocationRequest(){
val builder=LocationSettingsRequest.builder()
.addLocationRequest(locationRequest)
val client=LocationServices.getSettingsClient(此)
val task=client.checkLocationSettings(builder.build())
task.addOnSuccessListener(此){
//满足所有位置设置。客户端可以初始化
//这里有位置请求。
// ...
}
task.addOnFailureListener(this){e->
如果(e是可解决的异常){
//不满足位置设置,但可以修复此问题
//通过向用户显示一个对话框。
试一试{
//通过调用startResolutionForResult()显示对话框,
//并在onActivityResult()中检查结果。
e、 StartResult解决方案(
this@HomeScreen,
0
)
}catch(sendEx:IntentSender.SendIntentException){
//忽略错误。
}
}
}
}
趣味getDistanceRun(步数:长):浮动{
返回(步骤*78).toFloat()/100000.toFl
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Looper;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;

import java.util.List;

/**
 * Created by Ibkunle Adeoluwa on 1/8/2019.
 */


public class LocationManager {

    private FusedLocationProviderClient fusedLocationProviderClient;
    private LocationCallback locationCallback;
    private LocationRequest locationRequest;



    //TODO Import these Libraries in gradle
    /*
    implementation 'com.google.android.gms:play-services-location:11.8.0'
    implementation 'com.karumi:dexter:5.0.0'
    */

    private Activity myActivity;

    public LocationManager(Activity myActivity) {
        this.myActivity = myActivity;
    }


    public void requestLocationPermissions() {
        //Request required permissions using Dexter Library ACCESS_COARSE_LOCATION & ACCESS_FINE_LOCATION
        Dexter.withActivity(myActivity)
                .withPermissions(Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.ACCESS_FINE_LOCATION)
                .withListener(new MultiplePermissionsListener() {
                    @Override
                    public void onPermissionsChecked(MultiplePermissionsReport report) {
                        if (report.areAllPermissionsGranted()) {
                            buildLocationRequest();
                            buildLocationCallback();
                            if (ActivityCompat.checkSelfPermission(myActivity, Manifest.permission.ACCESS_FINE_LOCATION)
                                    != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(myActivity, Manifest.permission.ACCESS_COARSE_LOCATION)
                                    != PackageManager.PERMISSION_GRANTED) {
                                return;
                            }
                            fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(myActivity);
                            fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper());
                        }
                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                        Toast.makeText(myActivity, "Location Permission Denied", Toast.LENGTH_SHORT).show();

                    }
                }).check();
    }


    private void buildLocationRequest() {
        //Get Location
        locationRequest = new LocationRequest();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(5000);
        locationRequest.setSmallestDisplacement(10.0f);
    }

    private Location buildLocationCallback() {
        //Process location response
        final Location location = new Location();

        locationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);
                //Log
                Log.d("Location", locationResult.getLastLocation().getLatitude()
                        + "/" + locationResult.getLastLocation().getLongitude());

                location.setLatitude(locationResult.getLastLocation().getLatitude());
                location.setLongitude(locationResult.getLastLocation().getLongitude());


            }
        };
        return location;
    }

    //TODO How to Use

    /***
     * Sample Request
     *
     System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'M') + " Miles\n");
     System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'K') + " Kilometers\n");
     System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'N') + " Nautical Miles\n");

     System.out.println(distance(10.46786, -98.53506,32.9697, -96.80322,  'M') + " Initial Miles\n");
     System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'M') + " Covered Miles\n");

     System.out.println(coveredDistance(distance(10.46786, -98.53506,32.9697, -96.80322), distance(32.9697, -96.80322, 29.46786, -98.53506))+ " Left Distance\n");

     System.out.println(percentageCoveredDistance(262.6777938054349,1558.5453389875424)+ " Covered Distance Percentage \n");
     *
     *
     ***/


    /**
     * Expected Output
     *
     262.6777938054349 Miles
     422.73893139401383 Kilometers
     228.10939614063963 Nautical Miles

     1558.5453389875424 Initial Miles
     262.6777938054349 Covered Miles

     1295.8675451821075 Left Distance
     17% Covered Distance Percentage
     *
     *
     **/


    /**
     *
     * @param lat1
     * @param lon1
     * @param lat2
     * @param lon2
     * @param unit
     * @return
     */
    private static double distance(double lat1, double lon1, double lat2, double lon2, char unit) {
        double theta = lon1 - lon2;
        double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
        dist = Math.acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60 * 1.1515;
        if (unit == 'K') {
            dist = dist * 1.609344;
        } else if (unit == 'N') {
            dist = dist * 0.8684;
        }
        return (dist);
    }

    /**
     *
     * @param lat1
     * @param lon1
     * @param lat2
     * @param lon2
     * @return
     */
    private static double distance(double lat1, double lon1, double lat2, double lon2) {
        double theta = lon1 - lon2;
        double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
        dist = Math.acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60 * 1.1515;
        return (dist);
    }

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    /*::  This function converts decimal degrees to radians             :*/
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

    /**
     *
     * @param deg
     * @return
     */
    private static double deg2rad(double deg) {
        return (deg * Math.PI / 180.0);
    }

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    /*::  This function converts radians to decimal degrees             :*/
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

    /**
     *
     * @param rad
     * @return
     */
    private static double rad2deg(double rad) {
        return (rad * 180.0 / Math.PI);
    }

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    /*::  This function converts subtracts initial from current distance:*/
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

    /**
     *
     * @param initialDistance
     * @param currentDistance
     * @return
     */
    private static double coveredDistance(double initialDistance, double currentDistance) {
        return (initialDistance - currentDistance);
    }

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    /*::This function converts the covered distance to percentage of the total :*/
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

    /**
     *
     * @param coveredDistance
     * @param totalDistance
     * @return
     */
    private static String percentageCoveredDistance(double coveredDistance, double totalDistance) {
        double percent = (100 * coveredDistance) / totalDistance;
        return String.format("%.0f%%", percent);
    }


}