远程XML在Google Maps v2上的标记

杰瑞

我设法在我的android项目中绘制地图,获取位置等

但是,我正在努力寻找一些基本或高级示例,以了解如何从远程xml文件将标记放置在google map v2上。

那么,如何从远程xml获取标记并使用Google Maps API v2显示它们?

这是XML文件格式的示例:

<?xml version="1.0" encoding="UTF-8"?>
<maintag>
   <item>
      <id>1</id>
      <name>Place</name>
      <lat>60.1736245</lat>
      <lng>12.0283267</lng>
      <description>Nice Place</description>
      <type>2</type>
      <spotid>191712</spotid>
      <image>placeimage</image>
   </item>
   <item>
      <id>2</id>
      <name>Place</name>
      <lat>61.1736245</lat>
      <lng>13.0283267</lng>
      <description>Nice Place</description>
      <type>3</type>
      <spotid>291712</spotid>
      <image>placeimage</image>
   </item>
</maintag>
丹尼尔·纽金特

您只需要在后台线程上的网络操作中访问XML,解析XML,然后在UI线程上相应地显示标记。

我只是使用此答案作为XML解析的指南而开始工作的。

进口:

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

这是完整的Activity类,其中包括AsyncTask作为内部类,该类从URL中的URL下载并解析XML doInBackground(),然后在URL中绘制Markers onPostExecute()

public class MapFromXML extends AppCompatActivity implements OnMapReadyCallback {

    GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_map_from_xml);
    }

    @Override
    public void onResume() {
        super.onResume();

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        if (mapFragment != null) {
            if (mMap == null) {
                mapFragment.getMapAsync(this);
            } else {
                new GetXmlAsync().execute();
            }
        }
    }

    @Override
    public void onPause() {
        super.onPause();
    }


    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

        new GetXmlAsync().execute();
    }


    public class GetXmlAsync extends AsyncTask<URL, Void, List<MarkerInfo>> {

        @Override
        protected List<MarkerInfo> doInBackground(URL... params) {

            List<MarkerInfo> markerInfoList = new ArrayList<>();
            Document doc = null;
            URL url = null;
            try {
                url = new URL("http://www.example.com/GoogleMapXML.xml");

                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = null;
                db = dbf.newDocumentBuilder();
                doc = db.parse(new InputSource(url.openStream()));

            } catch (ParserConfigurationException e1) {
                e1.printStackTrace();
            } catch (MalformedURLException e1) {
                e1.printStackTrace();
            } catch (SAXException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();

            }

            doc.getDocumentElement().normalize();

            NodeList nodeList = doc.getElementsByTagName("item");

            try {
                for (int i = 0; i < nodeList.getLength(); i++) {

                    Node node = nodeList.item(i);
                    Element fstElmnt = (Element) node;

                    NodeList nameList = fstElmnt.getElementsByTagName("name");
                    Element nameElement = (Element) nameList.item(0);
                    nameList = nameElement.getChildNodes();
                    String name = ((Node) nameList.item(0)).getNodeValue();

                    NodeList latList = fstElmnt.getElementsByTagName("lat");
                    Element latElement = (Element) latList.item(0);
                    latList = latElement.getChildNodes();
                    String lat = ((Node) latList.item(0)).getNodeValue();

                    NodeList lonList = fstElmnt.getElementsByTagName("lng");
                    Element lonElement = (Element) lonList.item(0);
                    lonList = lonElement.getChildNodes();
                    String lng = ((Node) lonList.item(0)).getNodeValue();

                    MarkerInfo info = new MarkerInfo(name, Double.parseDouble(lat), Double.parseDouble(lng));
                    markerInfoList.add(info);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return markerInfoList;
        }

        @Override
        protected void onPostExecute(List<MarkerInfo> markerList) {

            for (MarkerInfo info : markerList) {
                mMap.addMarker(new MarkerOptions().position(new LatLng(info.lat, info.lon))
                        .title(info.name)
                        .icon(BitmapDescriptorFactory
                                .defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
            }

            if (markerList.size() > 0) {
                mMap.moveCamera(CameraUpdateFactory
                        .newLatLng(new LatLng(markerList.get(0).lat, markerList.get(0).lon)));
                mMap.animateCamera(CameraUpdateFactory.zoomTo(5));
            }
        }
    }

    public class MarkerInfo {
        double lat;
        double lon;
        String name;
        public MarkerInfo(String n, double la, double lo) {
            name = n;
            lat = la;
            lon = lo;
        }
    }

}

这是res/layout/content_map_from_xml.xml活动布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MapFromXML"
    tools:showIn="@layout/activity_map_from_xml">

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment" />

</RelativeLayout>

结果:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android开发:如何共享我在Google Maps V2上放置的标记的位置

如何在Android上使用Google Maps API v2很好地管理标记

多个标记未显示在Google Maps V2中

如何使用Google Maps V2删除单个标记?

Android Google Maps v2:动画标记大小

Google Maps API v2:如何使标记可点击?

Android Google Maps v2删除默认标记

Google Maps API v2中的旋转标记

Google Maps v2缩放到特定标记

在Google Maps Android API V2上叠加图片

Android Maps API v2上的跳转标记

Google android maps api v2始终显示标记标题

如何纠正在Google Maps v2中平滑移动标记的问题?

处理快速添加/删除标记命令/ Google Maps v2 + ScrollListener

为什么片段中仅显示一个Google Maps V2标记?

Android Google Maps API V2中心标记

在 Google Maps v2 中获取地图标记 ID

如何在Google Maps V2 Android中指定“标记”上图标的大小

实时添加多个标记Google Maps v2 android

Google Maps Api v2中带有标记的永久标题

Google Maps Android API v2中带有文字的地图标记

在Google Maps API v2中更改标记的InfoWindow视图的页边距颜色

在Google Maps API v2 Android中添加多个标记

Google Maps API v2:如何使标记工具提示可点击?

适用于Android的Google Maps API v2:标记和折线位置不匹配

Google Maps Android API v2在缩放级别上显示标记

Android Google Maps v2从JSON数组php mySQL添加地图标记

针对Google Maps v2 utils的ClusterItems标记的ClusterManager多种样式

Google Maps v2夸大XML错误