我有一张包含地点清单的表格,我使用php(以恒定坐标作为用户位置)来获取json中与用户最近的地点,并将其传递给android回收站视图。我要问的是,是否有可能从android获取用户位置并从db获取最近的位置
获取最近的地方
<?php
require("dbdetails.php");
// Get parameters from URL
$center_lat = "0.2941146";
$center_lng = "32.5580577";
$radius = "25";
// Opens a connection to a mySQL server
$connection = mysql_connect ('localhost', $username, $password);
if (!$connection) {
die("Not connected : " . mysql_error());
}
// Set the active mySQL database
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected) {
die ("Can\'t use db : " . mysql_error());
}
// Search the rows in the markers table
$query = sprintf("SELECT
id,name,phone, (
3959 * acos (
cos ( radians(0.2941146) )
* cos( radians( lat ) )
* cos( radians( lng ) - radians(32.5580577) )
+ sin ( radians(0.2941146) )
* sin( radians( lat ) )
)
) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;");
$result = mysql_query($query);
if (!$result) {
die("Invalid query: " . mysql_error());
}
$dbdata = array();
// Iterate through the rows, adding XML nodes for each
while ($row = @mysql_fetch_assoc($result)){
$dbdata[]=$row;
}
//Print array in JSON format
$locs = json_encode($dbdata);
file_put_contents('nearestlocations.json', $locs);
?>
在附近放置适配器以将结果传递到android
public class NearestLocationAdapter extends RecyclerView.Adapter<NearestLocationAdapter.ViewHolder> {
private Context context;
private List<NearestLocation> listofnearestlocations;
public NearestLocationAdapter(Context context, List<NearestLocation> listofnearestlocations) {
this.context = context;
this.listofnearestlocations = listofnearestlocations;
}
@NonNull
@Override
public NearestLocationAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(context).inflate(R.layout.single_item, viewGroup, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull NearestLocationAdapter.ViewHolder viewHolder, int i) {
NearestLocation nerbylocation = listofnearestlocations.get(i);
viewHolder.textHospital.setText(nerbylocation.getName());
viewHolder.textNumber.setText(nerbylocation.getPhone());
viewHolder.textDistance.setText(nerbylocation.getDistance());
}
@Override
public int getItemCount() {
return listofnearestlocations.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView textHospital, textNumber, textDistance;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textHospital = itemView.findViewById(R.id.locationname);
textNumber = itemView.findViewById(R.id.locationphone);
textDistance = itemView.findViewById(R.id.locationdistance);
}
}
}
将结果添加到android
public class NearestLocationActivity extends AppCompatActivity {
private String url = "http://192.168.43.163/prep/nearestlocations.json";
private RecyclerView mList;
private LinearLayoutManager linearLayoutManager;
private DividerItemDecoration dividerItemDecoration;
private List<NearestLocation> nearList;
private RecyclerView.Adapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_nearest_location);
mList = findViewById(R.id.main_list);
nearList = new ArrayList<>();
adapter = new NearestLocationAdapter(getApplicationContext(),nearList);
linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
dividerItemDecoration = new DividerItemDecoration(mList.getContext(), linearLayoutManager.getOrientation());
mList.setHasFixedSize(true);
mList.setLayoutManager(linearLayoutManager);
mList.addItemDecoration(dividerItemDecoration);
mList.setAdapter(adapter);
getData();
}
private void getData() {
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading...");
progressDialog.show();
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i = 0; i < response.length(); i++) {
try {
JSONObject jsonObject = response.getJSONObject(i);
NearestLocation nearestLocation = new NearestLocation();
nearestLocation.setName(jsonObject.getString("name"));
nearestLocation.setPhone(jsonObject.getInt("phone"));
nearestLocation.setDistance(jsonObject.getInt("distance"));
nearList.add(nearestLocation);
} catch (JSONException e) {
e.printStackTrace();
progressDialog.dismiss();
}
}
adapter.notifyDataSetChanged();
progressDialog.dismiss();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("Volley", error.toString());
progressDialog.dismiss();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(jsonArrayRequest);
}
}
答案 0 :(得分:0)
尝试一下
Location locationA = new Location("point A");
locationA.setLatitude(lat);
locationA.setLongitude(lng);
Location locationB = new Location("point B");
locationB.setLatitude(lat);
locationB.setLongitude(lng);
double distance = locationA.distanceTo(locationB);
答案 1 :(得分:0)
您可以做的是使用FusedLocationProviderClient获取用户位置,然后按照@Wizard的建议获取最近的距离。
Location userLocation = //Get this value from the FusedLocationProviderClient
//Loop through each coordinate in your database and check the distance