从 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"));
}
这里是初学者。 我在 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"));
}