如何在android中获得两个经度和两个纬度(公里)之间的距离?

时间:2016-08-29 10:52:20

标签: android json

说明:             我知道这个问题大部分都在重复,但我有些困惑。我正在进行实时应用。其中,我在json中读取JSON数据,有一些经度和纬度。我获取当前经度和纬度的比较。我找到了一些方法,但我尝试了但没有得到预期的输出。

我想比较当前的经度和纬度是否在距离json纬度和经度的五千米(km)之下。如果用户超出范围超过5公里,则会显示消息用户超出范围。

这是我获取经度和纬度的代码

public class HomeFragment extends Fragment implements ConnectionCallbacks, OnConnectionFailedListener,LocationListener{

    public static final String TAG=TransactionFragment.class.getSimpleName();
    public static final String KEY_UGC="postData[ugc]";
    public static final String KEY_CUSTOMER_ID="postData[customerid]";
    public static final String KEY_UGC_ID="postData[ugcid]";

    View rootView;
    PreferenceSetting prefManager;

    ListView lvTransaction;
    List<String> items;
    TextView txtPoints;
    Button btnUgc,btnMore;
    List<Trasaction> trasactionList;
    TextView lblTrasaction,lblStation,lblNoBottle,lblPointsColl,lblPoints;

    int totalPoints=0;
    MainActivity activity;

    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;
    private double currentLatitude;
    private double currentLongitude;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        rootView=inflater.inflate(R.layout.fragment_home,container,false);

        prefManager=PreferenceSetting.getInstance(getActivity());


        mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                // The next two lines tell the new client that “this” current class will handle connection stuff
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                //fourth line adds the LocationServices API endpoint from GooglePlayServices
                .addApi(LocationServices.API)
                .build();

        // Create the LocationRequest object
        mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(10 * 1000)        // 10 seconds, in milliseconds
                .setFastestInterval(1 * 1000); // 1 second, in milliseconds

        activity=(MainActivity)getActivity();
        lblTrasaction=(TextView)rootView.findViewById(R.id.lbl_trasaction);
        lblTrasaction.setTypeface(AppController.fntAlice);

        lblStation=(TextView)rootView.findViewById(R.id.lbl_station);
        lblStation.setTypeface(AppController.fntVani);

        lblNoBottle=(TextView)rootView.findViewById(R.id.lbl_no_bottle);
        lblNoBottle.setTypeface(AppController.fntVani);

        lblPointsColl=(TextView)rootView.findViewById(R.id.lbl_points_coll);
        lblPointsColl.setTypeface(AppController.fntVani);

        lblPoints=(TextView)rootView.findViewById(R.id.lbl_points);
        lblPoints.setTypeface(AppController.fntVani);

        btnUgc=(Button)rootView.findViewById(R.id.btn_ugc);
        btnUgc.setTypeface(AppController.fntVani);

        btnMore=(Button)rootView.findViewById(R.id.btn_more);
        btnMore.setTypeface(AppController.fntVani);

        txtPoints=(TextView)rootView.findViewById(R.id.txt_points);
        txtPoints.setTypeface(AppController.fntVani);

        if(prefManager.getPoints()==0){
            txtPoints.setText("0");
        }
        else{
            txtPoints.setText(""+prefManager.getPoints());
        }
        if(Utils.isNetworkConnected(getActivity())){
            RequestParams params=new RequestParams();
            params.put(ApiCalls.REQUEST_CASE_LABEL,"customerHistory");
            params.put("postData[customerid]",prefManager.getCustomerId());
            getTransactionApiCall(params);
        }
        else{
            Toast.makeText(getActivity(),getString(R.string.internet), Toast.LENGTH_SHORT).show();
        }


        items=new ArrayList<>();

        lvTransaction=(ListView)rootView.findViewById(R.id.lv_transaction);

        btnMore.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Message message=new Message();
                Bundle bundle=new Bundle();
                bundle.putString("more","1");
                message.setData(bundle);
                activity.uiHandler.sendMessage(message);
            }
        });
        btnUgc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showDialog();
            }
        });
        return rootView;
    }

    @Override
    public void onResume() {
        super.onResume();
        mGoogleApiClient.connect();
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.v(this.getClass().getSimpleName(), "onPause()");

        //Disconnect from API onPause()
        if (mGoogleApiClient.isConnected()) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
            mGoogleApiClient.disconnect();
        }
    }
    @Override
    public void onConnected(Bundle bundle) {
        if (Build.VERSION.SDK_INT >= 21 &&
                ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return  ;
        }
        else {
            Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

            if (location == null) {
                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

            } else {
                currentLatitude = location.getLatitude();
                currentLongitude = location.getLongitude();
            }
        }
    }

    @Override
    public void onConnectionSuspended(int i) {}

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        if (connectionResult.hasResolution()) {
            try {
                connectionResult.startResolutionForResult(getActivity(), CONNECTION_FAILURE_RESOLUTION_REQUEST);

            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("Error", "Location services connection failed with code " + connectionResult.getErrorCode());
        }
    }

    @Override
    public void onLocationChanged(Location location) {
        currentLatitude = location.getLatitude();
        currentLongitude = location.getLongitude();
    }

    public void getUcgCallApi(final RequestParams params){
        AsyncHttpClient client=new AsyncHttpClient();
        client.setTimeout(AsyncHttpClient.DEFAULT_SOCKET_TIMEOUT);
        client.post(ApiCalls.API_CALL, params, new AsyncHttpResponseHandler() {

            @Override
            public void onStart() {
                super.onStart();
                Log.i(TAG,"GET UGC PARAMS:->>>"+params.toString());
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                try{
                    String str=new String(responseBody);
                    JSONObject mainObj=new JSONObject(str);
                    Log.e(TAG,"SUCCESS RESPONSE:=>>"+mainObj.toString());

                    if(mainObj.has("status") && !mainObj.isNull("status")){
                        if(mainObj.getString("status").equalsIgnoreCase("Success")){
                            JSONArray data=mainObj.getJSONArray("data");

                            JSONObject dataObj=data.getJSONObject(0);

                            prefManager.setPkUgcId(dataObj.getString("PK_UGC_ID"));
                            prefManager.setUgcCode(dataObj.getString("UGC_CODE"));

                            if(!prefManager.getPkUgcId().equals(PreferenceSetting.DEFAULT)){
                                Log.e(TAG,"UGC ID STORED::"+prefManager.getPkUgcId()+"\nUGC CODE::->"+prefManager.getUgcCode());

                                Date timeDate=Utils.getDate(Long.parseLong(dataObj.getString("EXPIRED_TIME")));

                                Log.e(TAG,"DATE UTIL:->"+timeDate);
                                Date currentDate=new Date();

                                double LOCATION_LATITUDE=Double.parseDouble(dataObj.getString("LOCATION_LATITUDE"));
                                double LOCATION_LONGITUDE=Double.parseDouble(dataObj.getString("LOCATION_LONGITUDE"));

                                Log.e(TAG,"GETCURRENT TIME:->"+currentDate.toString());

                                if(timeDate.after(currentDate)){
                                    Log.e(TAG,"FIRST DISTANCE:->"+distance(currentLatitude,currentLongitude,LOCATION_LATITUDE,LOCATION_LONGITUDE));
                                    if((distance(currentLatitude,currentLongitude,LOCATION_LATITUDE,LOCATION_LONGITUDE)/1000) <= 5 ) {
                                        Log.e(TAG,"AFTER DISTANCE:->"+distance(currentLatitude,currentLongitude,LOCATION_LATITUDE,LOCATION_LONGITUDE));
                                        RequestParams reqParams = new RequestParams();
                                        reqParams.put(ApiCalls.REQUEST_CASE_LABEL, "UGCReading");
                                        reqParams.put(KEY_UGC, prefManager.getUgcCode());
                                        reqParams.put(KEY_CUSTOMER_ID, prefManager.getCustomerId());
                                        reqParams.put(KEY_UGC_ID, prefManager.getPkUgcId());
//                                        readUgcCodeApiCall(reqParams);
                                    }
                                    else{
                                        Toast.makeText(getActivity(), "“You are out of range for redeem", Toast.LENGTH_SHORT).show();
                                    }
                                }
                                if(timeDate.before(currentDate)){
                                    Toast.makeText(getActivity(), "UGC Code Expired", Toast.LENGTH_SHORT).show();
                                }
                            }
                        }
                        else{
                            Toast.makeText(getContext(), mainObj.getString("status"), Toast.LENGTH_SHORT).show();
                        }
                    }

                }
                catch (Exception e){
                    Log.e(TAG,"on Success()==>"+Log.getStackTraceString(e));
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                try{
                    String str=new String(responseBody);
                    JSONObject mainObj=new JSONObject(str);

                    Log.e(TAG,"FAILURE RESPONSE:=>>"+mainObj.toString());
                }
                catch (Exception e){
                    Log.e(TAG,"on Failure()==>"+Log.getStackTraceString(e));
                }
            }
        });
    }

    public void readUgcCodeApiCall(final RequestParams params){
        AsyncHttpClient client=new AsyncHttpClient();
        client.setTimeout(AsyncHttpClient.DEFAULT_SOCKET_TIMEOUT);
        client.post(ApiCalls.API_CALL, params, new AsyncHttpResponseHandler() {

            @Override
            public void onStart() {
                super.onStart();
                Log.e(TAG,"PARAMS:->>>"+params.toString());
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                try {
                    String str=new String(responseBody);
                    JSONObject mainObj=new JSONObject(str);
                    Log.e(TAG,"SUCCESS RESPONSE readUgcCodeApiCall :=>>"+mainObj.toString());

                    if(mainObj.has("status") && !mainObj.isNull("status")){
                        if(mainObj.getString("status").equalsIgnoreCase("Success")){
                            Toast.makeText(getActivity(),getString(R.string.success), Toast.LENGTH_SHORT).show();

                            RequestParams params=new RequestParams();
                            params.put(ApiCalls.REQUEST_CASE_LABEL,"customerHistory");
                            params.put("postData[customerid]",prefManager.getCustomerId());
                            getTransactionApiCall(params);
                        }
                        else{
                            Toast.makeText(getActivity(),getString(R.string.unsuccess), Toast.LENGTH_SHORT).show();
                        }
                    }

                } catch (Exception e) {
                    Log.e(TAG,"on Success()==>"+Log.getStackTraceString(e));
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                try {
                    String str=new String(responseBody);
                    JSONObject mainObj=new JSONObject(str);
                    Log.e(TAG,"FAILURE RESPONSE:=>>"+mainObj.toString());

                } catch (Exception e) {
                    Log.e(TAG,"on Failure()==>"+Log.getStackTraceString(e));
                }
            }
        });
    }
    private 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);
    }

    private double deg2rad(double deg) {
        return (deg * Math.PI / 180.0);
    }
    private double rad2deg(double rad) {
        return (rad * 180.0 / Math.PI);
    }
    public void showDialog(){

        final Dialog dialog=new Dialog(getContext());
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.claim_dialog);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.setCanceledOnTouchOutside(true);
        dialog.setCancelable(true);

        final EditText editClaim=(EditText)dialog.findViewById(R.id.edit_claim);
//        editClaim.setTypeface(AppController.fntVani);
        Button btnClaim=(Button)dialog.findViewById(R.id.btn_claim);
        btnClaim.setTypeface(AppController.fntVani);

        btnClaim.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if(!editClaim.getText().toString().trim().equals("")) {

                    if (Utils.isNetworkConnected(getActivity())) {
                        RequestParams params=new RequestParams();
                        params.put(ApiCalls.REQUEST_CASE_LABEL,"getUGCDetails");
                        params.put(KEY_UGC,editClaim.getText().toString().trim());
                        getUcgCallApi(params);
                        if(dialog.isShowing()){
                            dialog.dismiss();
                        }

                    } else {
                        Toast.makeText(getContext(), getString(R.string.internet), Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
        dialog.show();
    }
}

JSON响应

enter image description here

在上面的代码中有一个方法,即getUcgCallApi(),我试图比较旧的和当前的经度和纬度。

请帮我解决这个问题。

提前致谢。

2 个答案:

答案 0 :(得分:3)

尝试这样做以获得两个lat - long之间的距离:

  float[] distance = new float[1];



  Location.distanceBetween(mLocation.latitude, mLocation.longitude, locations.latitude, locations.longitude, distance); 

计算出的距离存储在距离[0]中。如果距离长度为2或更大,则初始轴承存储在距离[1]中。如果距离长度为3或更大,则最终轴承存储在距离[2]中。

答案 1 :(得分:0)

点击此链接对您有所帮助:

Calculate distance in meters when you know longitude and latitude in java

capacity

调用此方法:

public static float distFrom(float lat1, float lng1, float lat2, float lng2) {
    double earthRadius = 6371000; //meters
    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
               Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
               Math.sin(dLng/2) * Math.sin(dLng/2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    float dist = (float) (earthRadius * c);

    return dist;
    }

您可以将仪表距离转换为公里。