如何在 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的textview中显示用户Android Mac地址
如何在 Android Studio 滚动条(如 Eclipse)中显示错误/警告标记?