【问题标题】:How can i get the distance between the two longitude and two latitude in kilometer in android?如何在android中以千米为单位获得两个经度和两个纬度之间的距离?
【发布时间】:2017-01-05 09:06:40
【问题描述】:

说明: 我知道这个问题大多是重复的,但我有点困惑。我正在开发实时应用程序。在其中,我读取了 json 中的 JSON 数据,那里有一些经度和纬度。我获取与当前经度和纬度的比较。我找到了一些方法,我尝试了但没有得到预期的输出。

我想比较我当前的经度和纬度何时在 json 经度和纬度的五公里以内。如果用户超出范围,例如超过 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 响应

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

请帮我解决这个问题。

提前致谢。

【问题讨论】:

    标签: android json


    【解决方案1】:

    试试这个来获取两个经纬度之间的距离:

    float[] distance = new float[1];
    Location.distanceBetween(mLocation.latitude, mLocation.longitude, locations.latitude, locations.longitude, distance); 
    

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

    【讨论】:

    • 这个方法的距离参数需要传入什么?
    • 浮点值的单位是米还是公​​里?
    • 以公里为单位
    【解决方案2】:

    查看此链接将对您有所帮助:

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

    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;
        }
    

    调用这个方法:

    float meter= distFrom(LOCATION_LATITUDE1,LOCATION_LONGITUDE2,LOCATION_LATITUDE2,LOCATION_LONGITUDE2);
    
    
    final float kilometer=meter/1000;
    

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

    【讨论】:

      猜你喜欢
      • 2019-12-02
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多