【问题标题】:Add markers on Map using coordinates from database, retrieving data with JSON使用数据库中的坐标在地图上添加标记,使用 JSON 检索数据
【发布时间】:2020-04-10 21:55:39
【问题描述】:

我正在尝试开发一个在 MapReady 上添加标记的应用程序,该标记具有从数据库中检索到的坐标。到目前为止,为了将数据发送到数据库(注册/登录/获取配置文件)等,我使用了JSON。现在我正在尝试以相同的方式从数据库中获取纬度和经度,但调试器在调用 Json 方法后显示变量为 Null。另外,我想问一下我应该如何放置标记的一些指导?我的意思是,用JSONObject 获取坐标,它会给我表格中的所有行吗?还是我必须使用其他方法来获取所有行并为每一行添加标记?谢谢!

在 onMapReady 结束时调用 AddMarker 以获取坐标,以便我可以添加标记:

 private void AdaugaMarker() {

    class AdaugaMarker extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... voids) {
            //creating request handler object
            RequestHandler requestHandler = new RequestHandler();

            //creating request parameters
            HashMap<String, String> params = new HashMap<>();
            params.put("problema", finalProblema);

            //returing the response
            return requestHandler.sendPostRequest(URLs.URL_GETALERTE, params);
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //displaying the progress bar while user registers on the server
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            //hiding the progressbar after completion

            try {
                //converting response to json object
                JSONObject obj = new JSONObject(s);

                //if no error in response
                if (!obj.getBoolean("error")) {
                    Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();

                    //getting the user from the response
                    JSONObject userJson = obj.getJSONObject("locatie");

                    latitudine_sql =Double.valueOf(userJson.getString("latitudine"));
                    longitudine_sql = Double.valueOf(userJson.getString("longitudine"));
                    tip_problema_sql = userJson.getString("tip_problema");
                } else {
                    Toast.makeText(getApplicationContext(), "Some error occurred", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    //executing the async task
    AdaugaMarker ru = new AdaugaMarker();
    ru.execute();
}

.php 由 URL_GETALERTE 调用:

case 'getAlerte':

            if(isTheseParametersAvailable(array('problema'))){

                $problema = $_POST['problema'];

                $stmt = $conn->prepare("SELECT latitudine, longitudine, tip_problema FROM alerte WHERE tip_problema = ?");
                $stmt->bind_param("s", $problema);
                $stmt->execute();
                $stmt->store_result(); 
                if($stmt->num_rows > 0){
                $stmt->bind_result($latitudine, $longitudine, $problema);
                        $stmt->fetch();

                        $locatie = array(
                            'latitudine'=>$latitudine,
                            'longitudine'=>$longitudine,
                            'tip_problema'=>$problema

                        );
                    $response['error'] = false; 
                    $response['message'] = 'Alerta raportata';
                    $response['locatie'] = $locatie;    
                }else   {
                    $response['error'] = true; 
                    $response['message'] = 'Eroare de identificare a alertelor';
                }               
                }else{
                    $response['error'] = false; 
                    $response['message'] = 'Alerta nu a putut fi raportata';
                }
            break;

在.php的开头我添加了$response = array();

编辑: 添加 JSONArray:

//converting response to json object
                JSONObject obj = new JSONObject(s);

                //if no error in response
                if (!obj.getBoolean("error")) {
                    Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();

                    JSONArray locatieArray = obj.getJSONArray("locatie");
                    for (int i = 0; i < locatieArray.length(); i++) {
                        JSONObject locatie = locatieArray.getJSONObject(i);
                        // check latitudine and longitudine is not null and if not null then cast these values and call the addMarker() method.
                        if(!locatie.isNull("latitudine") && !locatie.isNull("longitudine")) {
                            latitudine_sql =Double.valueOf(locatie.getString("latitudine"));
                            longitudine_sql = Double.valueOf(locatie.getString("longitudine"));
                            addMarker(latitudine_sql, longitudine_sql); // this method is implemented below
                        }
                        tip_problema_sql = locatie.getString("tip_problema");
                    }

                } else {
                    Toast.makeText(getApplicationContext(), "Some error occurred", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

【问题讨论】:

    标签: php android json


    【解决方案1】:

    您正在接收纬度和经度的 JSONArray,但您正在解析为 JSONObject。 //先创建这个类

    public class Locatie {
    private Double latitudine;
    
    private String tip_problema;
    
    private Double longitudine;
    
    public Double getLatitudine() {
        return latitudine;
    }
    
    public void setLatitudine(Double latitudine) {
        this.latitudine = latitudine;
    }
    
    public String getTip_problema() {
        return tip_problema;
    }
    
    public void setTip_problema(String tip_problema) {
        this.tip_problema = tip_problema;
    }
    
    public Double getLongitudine() {
        return longitudine;
    }
    
    public void setLongitudine(Double longitudine) {
        this.longitudine = longitudine;
    }
    
    @Override
    public String toString() {
        return "ClassPojo [latitudine = " + latitudine + ", tip_problema = " + tip_problema + ", longitudine = " + longitudine + "]";
    }
    

    }

     if (!obj.getBoolean("error")) {
                ArrayList<Locatie> locatieList = new ArrayList<>();
                Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();
    
                //getting the user from the response
                JSONArray userLatLngArray = obj.getJSONArray("locatie");
                for (int i = 0; i < userLatLngArray.length(); i++) {
                    Locatie locate = new Locatie();
                    JSONObject data = userLatLngArray.getJSONObject[i];
    
    
                    //Here you need to create List of POJO class to save all lat log values in list so //you can access any where.
                    locate.setLatitudine(Double.valueOf(data.getString("latitudine")));
                    locate.longitudine_sql(Double.valueOf(data.getString("longitudine")));
                    locate.setLatitudine(data.getString("tip_problema"));
    
                    locatieList.add(locate);
    
                    //locatieList will be arraylist of lat lng pojo
    
                }
    
            } else {
                Toast.makeText(getApplicationContext(), "Some error occurred", Toast.LENGTH_SHORT).show();
            }
    

    【讨论】:

    • 我已经尝试了这两个答案,但导致错误的情况位于.php中。从android的角度来看,这两个答案都是正确的。谢谢!
    【解决方案2】:

    试试这个方法

    //if no error in response
    if (!obj.getBoolean("error")) {
        Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();
    
        //getting the user from the response
        JSONObject userJson = obj.getJSONObject("locatie");
    
        // check latitudine and longitudine is not null and if not null then cast these values and call the addMarker() method. 
        if(!userJson.isNull("latitudine") && !userJson.isNull("longitudine")) {
            latitudine_sql =Double.valueOf(userJson.getString("latitudine"));
            longitudine_sql = Double.valueOf(userJson.getString("longitudine"));
    
            addMarker(latitudine_sql, longitudine_sql); // this method is implemented below
        }
        tip_problema_sql = userJson.getString("tip_problema");
    
    } else {
        Toast.makeText(getApplicationContext(), "Some error occurred", Toast.LENGTH_SHORT).show();
    }
    
    private void addMarker(double latitude, double longitude){
       LatLng position = new LatLng(latitude, longitude);
    
       // Instantiating MarkerOptions class
       MarkerOptions options = new MarkerOptions();
    
       // Setting position for the MarkerOptions
       options.position(position);
    
       // Setting title for the MarkerOptions
       options.title("Position");
    
       // Setting snippet for the MarkerOptions
       options.snippet("Latitude:"+latitude+",Longitude:"+longitude);
    
       // Adding Marker on the Google Map
       googleMap.addMarker(options); // make sure you have initialized googleMap
    
       // Creating CameraUpdate object for position
       CameraUpdate updatePosition = CameraUpdateFactory.newLatLng(position);
    
       // Creating CameraUpdate object for zoom
       CameraUpdate updateZoom = CameraUpdateFactory.zoomBy(4);
    
       // Updating the camera position to the user input latitude and longitude
       googleMap.moveCamera(updatePosition);
    
       // Applying zoom to the marker position
       googleMap.animateCamera(updateZoom);
    }
    

    更新:

    对于多个标记

    // get locatie as JsonArray
    JSONArray locatieArray = obj.getJSONArray("locatie");
    for (int i = 0; i < locatieArray.length(); i++) {
          JSONObject locatie = locatieArray.getJSONObject[i];
    
          // check latitudine and longitudine is not null and if not null then cast these values and call the addMarker() method. 
          if(!locatie.isNull("latitudine") && !locatie.isNull("longitudine")) {
              latitudine_sql =Double.valueOf(userJson.getString("latitudine"));
              longitudine_sql = Double.valueOf(userJson.getString("longitudine"));
    
              addMarker(latitudine_sql, longitudine_sql); // this method is implemented below
          }
          tip_problema_sql = userJson.getString("tip_problema");
    }
    

    【讨论】:

    • 首先,从 php.ini 中检索出现错误。 latitudine_sql 得到 Double.valueOf(userJson.getString("latitudine")); 后为空,经度也为空
    • 好吧,你可以通过检查userJson.isNull("latitudine")来绕过错误。查看我的更新答案。
    • 您不能将null 转换为intdouble。因此,在转换为 intfloatdouble 之前,您必须正确检查并确保值不是 null
    • 我已经尝试过了,它现在可以工作了,但是应用程序在地图上只添加了 1 个标记 = 表格中的 1 行,而不是全部。
    • 看到这个了解邮递员youtube.com/watch?v=t5n07Ybz7yI
    猜你喜欢
    • 2016-03-01
    • 2015-12-23
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多