【问题标题】:How to get Google map (map_icon, title, latitude, longitude) dynamically from webservice如何从网络服务动态获取谷歌地图(map_icon、标题、纬度、经度)
【发布时间】:2017-03-29 10:35:48
【问题描述】:

这是我的web service

我想从给定的 Web 服务中动态获取 map_icon、经度、纬度。我被困在这一点上。我该怎么做,请帮帮我。 在旧代码中所做的是根据 id 从 Web 服务获取经度、纬度、post_title,然后静态分配图像。


Frnt_mapActivity.java

public class Frnt_mapActivity extends Activity {

public String Shop_title;
public String Shop_address;
public String Shop_icons;
ProgressDialog mDialog;
JSONObject jsonobject3;
JSONArray jsonarray3;
// Google Map
private static GoogleMap googlemap;
public static ArrayList<SearchBeams> searchdata_list;
public static ArrayList<NormalSearchBeams> normlSearchList;
ArrayList<All_products_lat_long> venueList;

private int i;
private Intent intent;
HashMap<Marker, Integer> hashMap=new HashMap<Marker, Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.frnt_map_activity);

    googlemap=((MapFragment)getFragmentManager().findFragmentById(R.id.places_map)).getMap();
    googlemap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    googlemap.setMyLocationEnabled(true);
    googlemap.getUiSettings().setZoomControlsEnabled(true);
    googlemap.getUiSettings().setMyLocationButtonEnabled(true);
    googlemap.getUiSettings().setCompassEnabled(true);
    googlemap.getUiSettings().setRotateGesturesEnabled(true);
    googlemap.getUiSettings().setZoomGesturesEnabled(true);
    googlemap.setMyLocationEnabled(true);
    intent=new Intent(Frnt_mapActivity.this,MainActivity.class);
    googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

        @Override
        public void onInfoWindowClick(Marker arg0) {
            i=hashMap.get(arg0);
            intent.putExtra("PRODUCT_ID", venueList.get(i).getId());
            startActivity(intent);
            //overridePendingTransition( R.anim.slide_right, R.anim.slide_left );
        }
    });


    new Frnt_mIcons_Activity().execute();


}

class AddMarkerAsyncTask extends AsyncTask<String,String,String>{

    private All_products_lat_long venue;
    private int k;
    BitmapDescriptor bd=null;

    AddMarkerAsyncTask(All_products_lat_long venue,int k){
        this.venue=venue;
        this.k=k;
    }




    @Override
    protected String doInBackground(String... strings) {
        try{
            bd=BitmapDescriptorFactory.fromBitmap(Glide.
                    with(Frnt_mapActivity.this).
                    load(venue.getMap_icon()).
                    asBitmap().
                    into(100, 100). // Width and height
                    get());
        }catch (Exception e){
            bd=null;
            e.printStackTrace();

        }

        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        try{
            if(bd!=null){
                Marker marker=googlemap.addMarker(new MarkerOptions()
                        .position(new LatLng(Double.parseDouble(venue.getLatitude()), Double.parseDouble(venue.getLongitude())))
                        .title(venue.getPost_title())
                        .icon(bd));
                hashMap.put(marker, k);
            }

        }catch (Exception e){
            e.printStackTrace();
        }


    }
}


private void addMarkers() {




    for(int k=0; k<venueList.size(); k += 1){

        //nirmal
        try{
            Log.e("nirmal",venueList.get(k).getMap_icon());

            //new AddMarkerAsyncTask(venueList.get(k),k).execute();

            double ln = Double.parseDouble(venueList.get(k).getLongitude());
            double la = Double.parseDouble(venueList.get(k).getLatitude());
                /*String title=venueList.get(k).getPost_title()==null?"":venueList.get(k).getPost_title();
                URL url = new URL(venueList.get(k).getMap_icon());
                Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
                BitmapDescriptor bd=BitmapDescriptorFactory.fromBitmap(image);*/


                /*Marker marker=googlemap.addMarker(new MarkerOptions()
                        .position(new LatLng(la, ln))
                        .title(title)
                        .icon(bd));
                hashMap.put(marker, k);*/

            switch (Integer.parseInt(venueList.get(k).getId()))
            {
                case 5689 :
                    Marker marker=googlemap.addMarker(new MarkerOptions()
                            .position(new LatLng(la, ln))
                            .title(venueList.get(k).getPost_title())
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.fruitandveg)));
                    hashMap.put(marker, k);
                    break;
                case 5779 :
                    Marker marker1=googlemap.addMarker(new MarkerOptions()
                            .position(new LatLng(la, ln))
                            .title(venueList.get(k).getPost_title())
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.coffee)));
                    hashMap.put(marker1, k);
                    break;
                case 5798 :
                    Marker marker3 = googlemap.addMarker(new MarkerOptions()
                            .position(new LatLng(la, ln))
                            .title(venueList.get(k).getPost_title())
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.takeaway)));
                    hashMap.put(marker3, k);
                    break;
                case 5810 :
                    Marker marker4 = googlemap.addMarker(new MarkerOptions()
                            .position(new LatLng(la, ln))
                            .title(venueList.get(k).getPost_title())
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.restaurant_steakhouse)));
                    hashMap.put(marker4, k);
                    break;
                case 6005 :
                    Marker marker5 = googlemap.addMarker(new MarkerOptions()
                            .position(new LatLng(la, ln))
                            .title(venueList.get(k).getPost_title())
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.clambers_playcentre)));
                    hashMap.put(marker5, k);
                    break;
                case 6011 :
                    Marker marker6 = googlemap.addMarker(new MarkerOptions()
                            .position(new LatLng(la, ln))
                            .title(venueList.get(k).getPost_title())
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.thetruecrimemuseum)));
                    hashMap.put(marker6, k);

                    break;
                .........
                ...........
                ............
                default :
                    break;
            }

        }catch (Exception e){
            Log.e("addMarkers",k+"");
            e.printStackTrace();
        }


    }
}

/******************FOR MAP******************/
class Frnt_mIcons_Activity extends AsyncTask<String, String, String> {

    public ArrayList<All_products_lat_long> maplist;


    @Override
    protected void onPreExecute() {
        mDialog = new ProgressDialog(Frnt_mapActivity.this);
        mDialog.setMessage("Loading...");
        mDialog.setCancelable(false);
        mDialog.show();
        super.onPreExecute();
    }




    // Slow Implementation
    private String inputStreamToString(InputStream is) {
        String s = "";
        String line = "";
        // Wrap a BufferedReader around the InputStream
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        // Read response until the end
        try {
            while ((line = rd.readLine()) != null) {
                s += line;
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // Return full string
        return s;
    }


    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub  
        maplist = new ArrayList<All_products_lat_long>();

        HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;

        DefaultHttpClient client = new DefaultHttpClient();

        SchemeRegistry registry = new SchemeRegistry();
        SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
        socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
        registry.register(new Scheme("http", socketFactory, 443));
        SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry);
        DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams());



  // Set verifier
                HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
        HttpPost httpPost = new HttpPost("http://towncitycards.com/webservice_action.php?action=all_products");

        try{

            HttpResponse response = httpClient.execute(httpPost);
            String data = inputStreamToString(response.getEntity().getContent());
            jsonobject3 = new JSONObject(data);
            jsonarray3 = new JSONArray(jsonobject3.getString("all_products"));
            venueList =new ArrayList<All_products_lat_long>();
            for(int j=0; j<jsonarray3.length();j++){
                JSONObject itemobj = jsonarray3.getJSONObject(j);
                //SHOW SEARCH RESULT
                All_products_lat_long searchItems = new All_products_lat_long();

                searchItems.setId(itemobj.getString("ID"));
                searchItems.setPost_title(itemobj.getString("post_title"));
                searchItems.setMap_icon(itemobj.getString("map_icon"));
                searchItems.setLongitude(itemobj.getString("longitude"));
                searchItems.setLatitude(itemobj.getString("latitude"));
                //          System.out.println("######Ashish is object >>"+itemobj);
                venueList.add(searchItems);
                //      System.out.println("SEARCHLISTSS@@@@@@@"+venueList.get(j).getLongitude());
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }


    @Override
    public void onPostExecute(String result) {
        super.onPostExecute(result);

        //System.out.println("SEARCHLISTSS@@@@@@@"+venueList);
        //System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAA"+venueList);
        try{
            if(venueList.size()>0)
            {
                addMarkers();
//              Toast.makeText(Frnt_mapActivity.this,"Search for the venue11.",Toast.LENGTH_SHORT).show();

            }
            else
                Toast.makeText(Frnt_mapActivity.this,"Search for the venue.",Toast.LENGTH_SHORT).show();
            //LatLng coordinate = new LatLng(22.75852160, 75.8911550);
            LatLng coordinate = new LatLng(50.85514, 0.58382);
            CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 18);
            googlemap.animateCamera(yourLocation);
            for (int i = 0; i < jsonarray3.length(); i++) {

                jsonobject3 = jsonarray3.getJSONObject(i);

                Shop_title = jsonobject3.optString("post_title");
                Shop_address = jsonobject3.optString("map_icon");
                Shop_icons = jsonobject3.optString("map_icon");
                //}
            }


        }catch(Exception e){
            e.printStackTrace();
        }

        if(mDialog!=null && mDialog.isShowing()){
            mDialog.dismiss();
        }
    }
}

}

【问题讨论】:

    标签: android web-services google-maps


    【解决方案1】:

    在您的服务器响应 JSON 中没有标记图标,只是对其的引用。所以你应该:

    1) 从您的“网络服务”下载 JSON 响应(例如在this 问题答案中,但最好使用Service);

    2) 对于响应的每个“ID”,从 URL 中获取图标,存储在“map_icon”字段中(例如在that 问题答案中)

    3) 创建带有图标的谷歌地图标记。在 p.2 中下载,如您的“旧代码”或that

    更新

    您的任务中有几个问题:

    1) 您的服务器响应包含错误的“map_icon”网址:http:// 协议前缀而不是https://,因此您应该将http:// 替换为https://

    2) 一些“map_icon”网址包含 UNICODE 符号(如 save£2.png 中的符号英镑“£”),因此您应该将其编码为 percent-encoded 格式:save%C2%A32.png 而不是 save£2.png

    3) 一些“map_icon”网址甚至不存在(如

    https://towncitycards.com/wp-content/uploads/2015/01/googlemapicons/save50p.png 或者 https://towncitycards.com/wp-content/uploads/2015/01/googlemapicons/information.png) 所以你应该忽略它(或为其设置一些默认图标)

    因此,根据这一点,上述(更新前)步骤可以使用基于AsyncTask 的类来完成,如下所示:

    protected class CreateProductListTask extends AsyncTask<Void, Void, List<Product>> {
    
        private String serverUrl;
    
        public CreateProductListTask(String url) {
            super();
            this.serverUrl = url;
        }
    
        @Override
        protected List<Product> doInBackground(Void... params)
        {
    
            URLConnection urlConn = null;
            BufferedReader bufferedReader = null;
            try
            {
                URL url = new URL(this.serverUrl);
                urlConn = url.openConnection();
                bufferedReader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
    
                StringBuffer stringBuffer = new StringBuffer();
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    stringBuffer.append(line);
                }
    
                JSONObject response = new JSONObject(stringBuffer.toString());
    
                List<Product> products = new ArrayList<>();
                HashMap<String, Bitmap> iconsMap = new HashMap<>();
                try {
                    JSONArray productsJSON = response.getJSONArray("all_products");
                    for (int ixProduct=0; ixProduct<productsJSON.length(); ixProduct++) {
                        JSONObject productJSON = productsJSON.getJSONObject(ixProduct);
                        String mapIconStr = productJSON.getString("map_icon");
                        URI uri = new URI(mapIconStr);
                        String[] segments = uri.getPath().split("/");
                        String iconName = segments[segments.length-1];
    
                        // percetn-encode URL
                        String mapIconPath = mapIconStr.substring(0, mapIconStr.indexOf(iconName));
                        String iconUrlString = mapIconPath + URLEncoder.encode(iconName, "UTF-8");
    
                        // replace "http:" with "https:"
                        iconUrlString = iconUrlString.replace("http:", "https:");
    
                        Bitmap bmp;
                        if (!iconsMap.containsKey(iconUrlString)) {
                            bmp = getBitmapFromURL(iconUrlString);
                            // populate map with unique icons
                            iconsMap.put(iconUrlString, bmp);
                        } else {
                            bmp = iconsMap.get(iconUrlString);
                        }
    
                        if (bmp != null) {
                            try {
                                Product product = new Product();
                                product.name = productJSON.getString("post_title");
                                product.lat = productJSON.getDouble("latitude");
                                product.lon = productJSON.getDouble("longitude");
                                product.icon = bmp;
                                products.add(product);
                            } catch (Exception ignore) {
                            }
                        }
    
                    }
    
                } catch (JSONException ex) {
                    Log.e("App", "Failure", ex);
                }
    
                return products;
            }
            catch(Exception ex)
            {
                Log.e("App", "yourDataTask", ex);
                return null;
            }
            finally
            {
                if(bufferedReader != null)
                {
                    try {
                        bufferedReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        @Override
        protected void onPostExecute(List<Product> products)
        {
            if(products != null) {
                for (Product product : products) {
                    googlemap.addMarker(new MarkerOptions()
                            .position(new LatLng(product.lat, product.lon))
                            .title(product.name)
                            .icon(BitmapDescriptorFactory.fromBitmap(product.icon))
                            );
                }
            }
        }
    }
    

    Product 类在哪里:

    protected class Product {
        public String name;
        public double lat;
        public double lon;
        public Bitmap icon;
    }
    

    getBitmapFromURL() 是:

    public static Bitmap getBitmapFromURL(String src) {
    try {
        URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        bmOptions.inSampleSize = 1;
        bmOptions.inJustDecodeBounds = false;
        Bitmap myBitmap = BitmapFactory.decodeStream(input, null, bmOptions);
        return myBitmap;
    } catch (IOException e) {
        return null;
    }
    

    }

    你可以这样称呼它(当然在你得到googlemapGoogleMap对象的引用之后):

    CreateProductListTask responseDownloadTask = new CreateProductListTask("https://www.towncitycards.com/webservice_action.php?action=all_products");
    responseDownloadTask.execute();
    

    最后(在 20-30 秒后,因为不存在的图标的服务器响应延迟)你得到了类似的东西:

    也许你需要像thisgoodm的答案那样缩放图标

    当然,这只是示例,您需要 Service 而不是 AsyncTask 从 URL 下载数据和图像(请参阅 Virgil Dobjanschi about patterns)。

    【讨论】:

    • 如何创建一个包含所有 map_icon 的数组,然后像link 一样在 URL 中使用?
    • 或者我可以用其他方式来做
    • 先生,您太棒了。非常感谢您。
    • 还有一件事。我想增加 map_icon 的大小,我该怎么做。再次感谢你甚至不知道你是如何拯救我的。
    • @priya 只需在 product.icon = bmp; 行之前添加 bmp = Bitmap.createScaledBitmap(bmp,(int)(bmp.getWidth()*3), (int)(bmp.getHeight()*3), true);(其中 3 是比例系数,您可以将其更改为 5 以获得更大的图标)。如果它对你很重要,你也可以投票赞成:)
    【解决方案2】:

    我不太明白你的问题,但是

    你可以做

    Map<String, Marker> markerMap;
    

    其中 String 是你的 ID ,或者你想要的 int

    然后

    int 你的 AsynTask 以获取 JSON 数据

     Marker marker = YOURMAP.addMarker(options);
                        marker.setTag(YOUR_ID);
                        //   markers.add(marker);
                        markerMap.put(YOUR_ID, marker);
    

    选项在哪里

    MarkerOptions options = new MarkerOptions();
                        options.position(YOUR_JSON_OBJECT.Latitude, YOUR_JSON_OBJECT.Longtite));
                        options.title(YOUR_TITLE);
                         options.visible(true);
                             options.icon(YOUR_IMAGE);
    

    希望是帮助

    【讨论】:

      猜你喜欢
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2011-07-14
      相关资源
      最近更新 更多