【问题标题】:Get array of coordinates from mysql database and add as markers to Google map in android从 mysql 数据库中获取坐标数组并作为标记添加到 android 中的 Google 地图
【发布时间】:2017-08-04 18:38:27
【问题描述】:

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

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

但是,我需要在从 mysql 中获取坐标后,动态设置一组标记。

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

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();
?>

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

我的地图看起来有点像这样。我在 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));
}

谢谢!

【问题讨论】:

标签: java php mysql google-maps-android-api-2


【解决方案1】:

您可能需要一个 for 循环来插入标记,您能否发布 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"));


}

【讨论】:

  • 我注意到你的服务器正在发送一个列表,如:-32.4324234 -58.4023392 -32.4453244 -58.3984984 我建议使用类似12.34567,12.346432,6# 这样你就知道哪个是纬度,哪个是长
  • 正确,这就是响应的样子。
  • 检查我编辑的内容并提出建议,并在我为你编写代码时给我一些时间
  • 美丽。在我将 PHP 结果更改为 include 和 # 后,效果很好。谢谢@Joaquin Peraza
猜你喜欢
  • 2013-12-18
  • 2017-06-24
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
相关资源
最近更新 更多