从 mysql 数据库获取坐标数组并作为标记添加到 android 中的 Google 地图

Get array of coordinates from mysql database and add as markers to Google map in android

这里是初学者。 我在 Android Studio 中创建了一个带有地图片段的 activity,我没有像这样动态添加 1 个标记或非动态添加多个标记的问题:

    LatLng sydney = new LatLng(-34, 151);
    LatLng spokane = new LatLng(-35, 171);
    LatLng idaho = new LatLng(-32.3, 150);

但是,在从 mysql.

获取坐标后,我需要动态设置一个标记数组

现在,出于测试目的,我有一个按钮 'getCoords' 可以在单击时执行此操作(我将坐标输出到文本视图中以查看它是否有效。我能够获取要显示的值在文本视图中):

public void getCoords(View view){
    new CoordsBackgroundTask().execute();

}
class CoordsBackgroundTask extends AsyncTask<Void, Void, String>{

    String json_url_coords;
    @Override
    protected void onPreExecute(){
        json_url_coords = "MY PHP FILE URL";
    }

    @Override
    protected String doInBackground(Void... voids) {
        try {
            URL url = new URL(json_url_coords);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();
            while ((JSON_STRING = bufferedReader.readLine())!=null)
            {

                stringBuilder.append(JSON_STRING+"\n");
            }

            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();
            return  stringBuilder.toString().trim();


        }catch (MalformedURLException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Void... values){
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result) {
        TextView textview = (TextView) findViewById(R.id.textview);
        textview.setText(result);
        json_string = result;
    }
}

PHP:

    <?php
$mysqli = new mysqli("localhost", "MYUSER", "MYPASS", "MYDB");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

$query = "SELECT markers.lat, markers.lng
FROM markers
INNER JOIN userIds ON markers.user_id = userIds.user_id";

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {
echo $row['lat'];
echo $row['lng'];
}
    /* free result set */
    $result->free();
}

/* close connection */
$mysqli->close();
?>

我能够成功 return lat 和 lng 数组,我只是从这里遇到了困难,至于如何,点击从数据库中获取坐标的按钮, 然后将这些标记添加到 activity 上的地图片段。我需要以某种方式解析数组吗?我可以使用循环将标记带入地图吗?总会有不同数量的坐标组。

我的地图看起来有点像这样。我在 setUpMap 中有它,所以我可以默认调用它 onMapReady,然后在以某种方式单击按钮时回调它...

 @Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    setUpMap();
}

    private void setUpMap() {
    LatLng sydney = new LatLng(-34, 151);
    LatLng spokane = new LatLng(-35, 171);
    LatLng idaho = new LatLng(-32.3, 150);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.addMarker(new MarkerOptions().position(spokane).title("Marker in spokane"));
    mMap.addMarker(new MarkerOptions().position(idaho).title("Marker in idaho"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}

谢谢!

您可能需要一个 for 循环来插入标记,您可以 post PHP 响应,这样我可以帮助您实现一些东西来将其解析为 LatLng 列表,然后添加一个每个标记。

回答

假设您的点是像 lat,lng,# -32.430412,-58.321323,# 这样的线,并且您的服务器会为您提供一个列表,您首先将其拆分为:

String answer = "-32.430412,-58.321323,#-32.430412,-58.321323,#-32.430412,-58.321323,#";
// note that line breaks disappeared after parsing it to string
String[] parts = answer.split("#");

for (String point : parts) {
String[] pointData = point.split(",");
Float lat= Float.parseFloat(pointData[0]);
Float lng= Float.parseFloat(pointData[1]);
/// check if fit your actual map, remember you need everything required here loaded and declared before calling.
  mMap.addMarker(new MarkerOptions()
    .position(new LatLng(lat, lng))
    .title("Hello world"));


}