начинающий здесь.
Я создал действие в Android Studio с фрагментом карты, и у меня нет проблем с динамическим добавлением 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();
?>
Я могу успешно вернуть массив 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));
}
Спасибо!
Вам, вероятно, понадобится цикл 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"));}
Других решений пока нет …