Список рядом с местами из базы данных Android - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть таблица со списком мест, я использую php с (постоянные координаты в качестве местоположения пользователя), чтобы получить ближайшее место для пользователя в json и передать его в представление Android Recycle.То, что я спрашиваю, возможно ли получить местоположение пользователей от Android и получить ближайшее место из БД, спасибо за вашу помощь

Получение ближайшего места

    <?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 голосов
/ 15 февраля 2019

Что вы можете сделать, это получить местоположение пользователя, используя FusedLocationProviderClient , а затем получить ближайшее расстояние, выполнив то, что предложил @Wizard.

Location userLocation = //Get this value from the FusedLocationProviderClient
//Loop through each coordinate in your database and check the distance
0 голосов
/ 15 февраля 2019

Попробуйте это

    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);
...