簡體   English   中英

如何使用XML文件中的Google Maps在Android App上顯示坐標標記

[英]How to show coordinates-markers on Android App with Google Maps from XML file

我有一個xml文件,其中包含一些位置及其坐標。 我想在Google地圖上的android應用中將這些位置顯示為標記。 我已經加載了地圖。 我該怎么辦? 即使有人可以從理論上解釋它,也可能會非常感謝任何幫助,因為我似乎無法理解它的概念。 有人可以幫忙嗎?

xml文件(placesp.xml)的示例:

<placesp>
<placep>
  <place_id>1</place_id>
  <name>Place1</name>
  <description>Place description 1</description>
  <coordinates>;40.430224;21.559570</coordinates>
</placep>
<placep>
  <place_id>2</place_id>
  <name>Place2</name>
  <description>Place description 2</description>
  <coordinates>;40.423324;21.062439</coordinates>
</placep>
<placep>
  <place_id>3</place_id>
  <name>Place3</name>
  <description>Place description 3</description>
  <coordinates>;40.266952;21.238220</coordinates>
</placep>
</placesp>

也許您可以使用HashMap保存數據。 您只需創建一個新類,如下所示:

public class Coordinates {
public static final HashMap<String, LatLng> COORDINATES = new HashMap<String, LatLng>();
static {

    // Place1
    COORDINATES.put("Place1", new LatLng(40.430224;21.559570));
}

}

您可以像這樣訪問哈希表存儲的數據:

                locationLatLng = new LatLng(Coordinates.COORDINATES.get("Place1").latitude,Coordinates.COORDINATES.get("Place1").longitude); 

然后在加載地圖的類中使用此行添加標記:

map.addMarker(new MarkerOptions().position(locationLatLng));

我不確定如何從xml文件訪問數據,但是理論上邏輯是相同的。 您必須獲得一個LatLng坐標來告訴addMarker方法將標記放置在哪里,實際上就是這樣。 希望我能幫到你。

首先,您需要創建一個模型類來保存每個位置的信息。 我為您提供一個示例波紋管: Place.class

public class Place {
private int placeId;
private String placeName;
private String placeDescription;
private double placeLongitude;
private double placeLatitude;

public Place() {
    super();
}

public int getPlaceId() {
    return placeId;
}

public void setPlaceId(final int placeId) {
    this.placeId = placeId;
}

public String getPlaceName() {
    return placeName;
}

public void setPlaceName(final String placeName) {
    this.placeName = placeName;
}

public String getPlaceDescription() {
    return placeDescription;
}

public void setPlaceDescription(final String placeDescription) {
    this.placeDescription = placeDescription;
}

public double getPlaceLongitude() {
    return placeLongitude;
}

public void setPlaceLongitude(final double placeLongitude) {
    this.placeLongitude = placeLongitude;
}

public double getPlaceLatitude() {
    return placeLatitude;
}

public void setPlaceLatitude(final double placeLatitude) {
    this.placeLatitude = placeLatitude;
}
}

接下來,您將需要一個XML解析器類來將XML數據檢索到“地點類型”列表中。 您可以使用以下示例: PlaceXmlParser.class

public class PlaceXmlParser {
private static final String TAG = PlaceXmlParser.class.getSimpleName();
private static final String PLACE_ID = "place_id";
private static final String PLACE_NAME = "name";
private static final String PLACE_DESCRIPTION = "description";
private static final String PLACE_COORDINATES = "coordinates";

public PlaceXmlParser() {
    super();
}

public List<Place> parsePlacesXml(final InputStream xmlStream) {
    Place place = null;
    final List<Place> placeList = new ArrayList<>();
    try {
        final XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
        final XmlPullParser parser = xmlFactoryObject.newPullParser();
        parser.setInput(xmlStream, null);
        int event = parser.getEventType();
        while (event != XmlPullParser.END_DOCUMENT) {
            if (event == XmlPullParser.START_TAG) {
                final String name = parser.getName();
                switch (name) {
                    case PLACE_ID:
                        place = new Place();
                        setPlaceId(parser, place);
                        break;
                    case PLACE_NAME:
                        setPlaceName(parser, place);
                        break;
                    case PLACE_DESCRIPTION:
                        setPlaceDescription(parser, place);
                        break;
                    case PLACE_COORDINATES:
                        setPlaceLatLong(parser, place);
                        placeList.add(place);
                        break;
                }
            }
            event = parser.next();
        }
    } catch (final XmlPullParserException e) {
        Log.e(TAG, e.toString());
    } catch (final IOException e) {
        Log.e(TAG, e.toString());
    }
    return placeList;
}

private boolean areValidArgs(final XmlPullParser parser, final Place place) {
    return null != parser && null != place;
}

private void setPlaceId(final XmlPullParser parser, final Place place) {
    if (areValidArgs(parser, place)) {
        final String placeId = getTagValue(parser);
        place.setPlaceId(Integer.parseInt(placeId));
    }
}

private void setPlaceName(final XmlPullParser parser, final Place place) {
    if (areValidArgs(parser, place)) {
        final String placeName = getTagValue(parser);
        place.setPlaceName(placeName);
    }
}

private void setPlaceDescription(final XmlPullParser parser, final Place place) {
    if (areValidArgs(parser, place)) {
        final String placeDescription = getTagValue(parser);
        place.setPlaceDescription(placeDescription);
    }
}

private void setPlaceLatLong(final XmlPullParser parser, final Place place) {
    if (areValidArgs(parser, place)) {
        final String[] latLong = getTagValue(parser).split(";");
        if (3 == latLong.length) {
            place.setPlaceLatitude(Double.parseDouble(latLong[1]));
            place.setPlaceLongitude(Double.parseDouble(latLong[2]));
        }
    }
}

private String getTagValue(final XmlPullParser parser) {
    String result = "";
    try {
        if (parser.next() == XmlPullParser.TEXT) {
            result = parser.getText();
            parser.nextTag();
        }
    } catch (final XmlPullParserException e) {
        Log.e(TAG, e.toString());
    } catch (final IOException e) {
        Log.e(TAG, e.toString());
    }
    return result;
}

}

最后,在您的Google Map活動中,實現OnMapReadyCallback接口,重寫onMapReady方法並將位置標記添加到Google Map: MapActivity.class

public class MapActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
private List<Place> placeList;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);
    this.placeList = getPlaceList();
}

@Override
public void onMapReady(final GoogleMap googleMap) {
    this.mMap = googleMap;
    addPlaceListMarkersToGoogleMap();
}

private void addPlaceListMarkersToGoogleMap() {
    for (final Place place : this.placeList) {
        final LatLong latLong = new LatLong(place.getPlaceLatitude(), place.getPlaceLongitude());
        this.mMap.addMarker(new MarkerOptions().position(latLong).title(place.getPlaceName()));
    }
}

private List<Place> getPlaceList() {
    final String xmlString = "<placesp>" +
            "<placep>" +
            "  <place_id>1</place_id>" +
            "  <name>Place1</name>" +
            "  <description>Place description 1</description>" +
            "  <coordinates>;40.430224;21.559570</coordinates>" +
            "</placep>" +
            "<placep>" +
            "  <place_id>2</place_id>" +
            "  <name>Place2</name>" +
            "  <description>Place description 2</description>" +
            "  <coordinates>;40.423324;21.062439</coordinates>" +
            "</placep>" +
            "<placep>" +
            "  <place_id>3</place_id>" +
            "  <name>Place3</name>" +
            "  <description>Place description 3</description>" +
            "  <coordinates>;40.266952;21.238220</coordinates>" +
            "</placep>" +
            "</placesp>";
    final InputStream xmlStream = getXmlStream(xmlString);
    final PlaceXmlParser parser = new PlaceXmlParser();
    return parser.parsePlacesXml(xmlStream);
}

private InputStream getXmlStream(final String xmlString) {
    InputStream xmlStream = null;
    try {
        xmlStream = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
    } catch (final UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return xmlStream;
}
}

提供的代碼適用於給定的XML示例,請注意可能的異常並進行處理。 希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM