在Android数据库中按地点列出附近

时间:2019-02-15 11:32:17

标签: php android mysql google-places

我有一张包含地点清单的表格,我使用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);
    }
}

2 个答案:

答案 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