如何在 Android Studio 中显示半径中 2 个标记的显示距离

Posted

技术标签:

【中文标题】如何在 Android Studio 中显示半径中 2 个标记的显示距离【英文标题】:How to show display distance of 2 marker in radius in Android Studio 【发布时间】:2018-01-30 18:15:42 【问题描述】:

Heloo 我是 android studio 的新手,我做了一个名为 BTS Locator 的项目,在 2 天内被混淆以显示两个 2 标记的距离。所以圆圈中心的标记是抱怨,另一个是 BTS。然后我想向 BTS 显示距离抱怨,有人可以帮我吗? enter image description here

这是我的 maps.activity

package com.example.jody_pc.btslocator;

import android.content.DialogInterface;
import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.util.Log;

import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.Circle;
import com.google.android.gms.maps.model.CircleOptions;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback 

    private GoogleMap mMap;
    String lat,lng;
    Double latitude,longitude;
    private Circle mCircle;
    private String[] id,vendor,cellname,tower_id,total_tilt,site_name,bsc_rnc,lac,ci,bcch,bsid_rncid,site_id,dir,ant_height,status_site,cell_type,cluster_name,band,kecamatan,kabupaten;
    int numData;
    LatLng latLng[];
    Boolean markerD[];

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // 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);

        Bundle b = getIntent().getExtras();

        lat = b.getString("lat");
        lng = b.getString("lng");



        latitude = Double.parseDouble(lat);
        longitude = Double.parseDouble(lng);



        sekitar();
    


    /**
     * 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;

        // Add a marker in Sydney and move the camera
        LatLng latlng = new LatLng(latitude, longitude);


        mMap.addMarker(new MarkerOptions().position(latlng));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 14.5f));
        drawMarkerWithCircle(latlng);

        //mMap.setOnInfoWindowClickListener(this);

    

    private void drawMarkerWithCircle(LatLng latlng) 
        double radiusInMeters = 2500.0;
        int strokeColor = 0xffff0000; //red outline
        int shadeColor = 0x44ff0000; //opaque red fill

        CircleOptions circleOptions = new CircleOptions().center(latlng).radius(radiusInMeters).fillColor(shadeColor).strokeColor(strokeColor).strokeWidth(8);
        mCircle = mMap.addCircle(circleOptions);
    

    private void sekitar()
        String url = "http://bts.telkompolines.com/sekitar.php?lat="+lat+"&&lng="+lng;
        /*String url = "https://devonly.000webhostapp.com/conn.php";*/
        JsonArrayRequest request = new JsonArrayRequest
                (Request.Method.GET, url, new Response.Listener<JSONArray>() 
                    @Override
                    public void onResponse(JSONArray response) 
                        numData = response.length();
                        Log.d("DEBUG_", "Parse JSON");
                        latLng = new LatLng[numData];
                        markerD = new Boolean[numData];
                        /*nama = new String[numData];*/
                        vendor = new String[numData];
                        site_name = new String[numData];
                        tower_id = new String[numData];
                        bsc_rnc = new String[numData];
                        lac = new String[numData];
                        ci = new String[numData];
                        bcch = new String[numData];
                        bsid_rncid = new String[numData];
                        site_id = new String[numData];
                        dir = new String[numData];
                        ant_height = new String[numData];
                        total_tilt = new String[numData];
                        status_site = new String[numData];
                        cell_type = new String[numData];
                        cluster_name = new String[numData];
                        band = new String[numData];
                        kecamatan = new String[numData];
                        kabupaten = new String[numData];
                        id = new String[numData];
                        cellname = new String[numData];

                        for (int i = 0; i < numData; i++) 
                            JSONObject data = null;
                            try 
                                data = response.getJSONObject(i);
                                id[i] = data.getString("id");
                                latLng[i] = new LatLng(data.getDouble("lat"),
                                        data.getDouble("lng"));
                                vendor[i] = data.getString("vendor");
                                cellname[i] = data.getString("cellname");
                                kabupaten [i] = data.getString("kabupaten");
                                tower_id [i] = data.getString("tower_id");
                                bsc_rnc [i] = data.getString("tower_id");
                                lac [i] = data.getString("lac");
                                ci [i] = data.getString("ci");
                                bcch [i] = data.getString("bcch");
                                bsid_rncid [i] = data.getString("bsid_rncid");
                                site_id [i] = data.getString("site_id");
                                site_name [i] = data.getString("site_name");
                                dir [i] = data.getString("dir");
                                ant_height [i] = data.getString("ant_height");
                                total_tilt [i] = data.getString("total_tilt");
                                status_site [i] = data.getString("status_site");
                                cell_type [i] = data.getString("cell_type");
                                cluster_name [i] = data.getString("cluster_name");
                                band [i] = data.getString("band");
                                kecamatan [i] = data.getString("kecamatan");



                                markerD[i] = false;
                                mMap.addMarker(new MarkerOptions()
                                        .position(latLng[i])
                                        .title(site_name[i]));
                                final int finalI = i;
                                mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() 
                                    @Override
                                    public boolean onMarkerClick(Marker marker) 
                                        Intent detail  = new Intent(getApplicationContext(), DetailActivity.class);
                                        Bundle b = new Bundle();
                                        LatLng position = marker.getPosition();
                                        /*Double x = position.latitude;
                                        Double y = position.longitude;

                                        String lat = Double.toString(x);
                                        String lng = Double.toString(y);*/

                                        b.putString("cellname", cellname[finalI]);
                                        b.putString("id", id [finalI]);
                                        b.putString("vendor", vendor[finalI]);
                                        b.putString("kabupaten", kabupaten[finalI]);
                                        b.putString("tower_id", tower_id[finalI]);
                                        b.putString("bsc_rnc", bsc_rnc[finalI]);
                                        b.putString("lac", lac[finalI]);
                                        b.putString("ci", ci[finalI]);
                                        b.putString("bcch", bcch[finalI]);
                                        b.putString("bsid_rncid", bsid_rncid[finalI]);
                                        b.putString("site_id", site_id[finalI]);
                                        b.putString("site_name", site_name[finalI]);
                                        b.putString("dir", dir[finalI]);
                                        b.putString("ant_height", ant_height[finalI]);
                                        b.putString("total_tilt", total_tilt[finalI]);
                                        b.putString("status_site", status_site[finalI]);
                                        b.putString("cell_type", cell_type[finalI]);
                                        b.putString("cluster_name", cluster_name[finalI]);
                                        b.putString("band", band[finalI]);
                                        b.putString("kecamatan", kecamatan[finalI]);
                                        b.putString("lat", String.valueOf(position.latitude).toString());
                                        b.putString("lng", String.valueOf(position.longitude).toString());
                                        detail.putExtras(b);
                                        startActivity(detail);

                                        return false;
                                    
                                );



                             catch (JSONException e) 
                                e.printStackTrace();
                            
                            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng[i], 15.5f));
                        
                    

                , new Response.ErrorListener() 
                    @Override
                    public void onErrorResponse(VolleyError error) 
                        AlertDialog.Builder builder = new AlertDialog.Builder(MapsActivity.this);
                        builder.setTitle("Error!");
                        builder.setMessage("No Internet Connection");
                        builder.setIcon(android.R.drawable.ic_dialog_alert);
                        builder.setPositiveButton("Refresh", new DialogInterface.OnClickListener() 
                            @Override
                            public void onClick(DialogInterface dialog, int which) 
                                sekitar();
                            
                        );
                        AlertDialog alert = builder.create();
                        alert.show();
                    
                );
        Volley.newRequestQueue(this).add(request);
    



【问题讨论】:

【参考方案1】:

您应该使用Location.distanceBetween 方法来计算您的中心点和点击的标记之间的距离(以米为单位)。

在您的onMarkerClick() 中执行以下操作(假设您想像处理所有其他 BTS 相关数据一样传递距离信息):

float[] results = new float[3];
Location.distanceBetween(self.latitude, self.longitude, position.latitude, position.longitude, results);
b.putString("distance_in_meters", String.valueOf(results[0]));

【讨论】:

你能告诉我如何从 json 中获取 lat 和 lng 以放入 Location.distanceBetween 吗?提前致谢 我想到的方法是使用点击的标记位置 LatLng position = marker.getPosition();您已经在 volley onResponse 方法中解析 JSON。你到底想达到什么目的?

以上是关于如何在 Android Studio 中显示半径中 2 个标记的显示距离的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 中显示隐藏文件

如何在android studio的textview中显示用户Android Mac地址

如何在 Android Studio 中显示依赖关系树?

如何在 Android Studio 滚动条(如 Eclipse)中显示错误/警告标记?

如何单击图像按钮并将其显示在 Android Studio 的新页面中?

如何在 Android Studio 中显示来自 SQLite 数据库浏览器的图像?