android在地图v2上检测各种圆圈

时间:2015-02-07 17:06:31

标签: android google-maps-markers google-maps-android-api-2 android-geofence

在我的小应用程序中,我有一张地图,我正在从网上解析XML,如下所示:

<place>
<lat>42.827602</lat>
<lon>-1.663957</lon>
<place_name>Place one</place_name>
<snippet>Snippet de place Facebook</snippet>
<thumb>http://www.animage.com/myicon1.png</thumb>
</place>

<place>
<lat>42.830750</lat>
<lon>-1.669064</lon>
<place_name>Place two</place_name>
<snippet>Snippet de place Twitter</snippet>
<thumb>http://www.animage.com/myicon2.png</thumb>
</place>

<place>
<lat>42.825333</lat>
<lon>-1.668232</lon>
<place_name>Place Three</place_name>
<snippet>Snippet de place Skype</snippet>
<thumb>http://www.animage.com/myicon3.png</thumb>
</place>

</response>

每当我从xml读取一个“地点”时,我的AsyncTask的onPostExecute会调用在我的应用程序地图上创建新标记和圆圈的方法

例如,如果xml有七个“位置”,则创建新标记和圆圈的方法会被调用七次。

Marker aMarker;
Circle aCircle;

//... 

public void createNewMarkerAndCircle() {

    //...

     aMarker = mMap.addMarker(new MarkerOptions()
                    .position(new LatLng(dLat, dLon))
                    .title(nombre_punto)
                    .snippet(introduccion_punto)
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));


            aCircle = mMap.addCircle(new CircleOptions()
                            .center(new LatLng(dLat, dLon))
                            .radius(150)
                            .strokeColor(Color.RED)

}
//...

 public void onPostExecute(String xml) {

        xml = stringBuffer.toString();
        try {

            Document doc = parser.getDomElement(xml);

            NodeList nl0 = doc.getElementsByTagName(KEY_PLACE);

            Element e = (Element) nl0.item(lap);

            theLat = parser.getValue(e, KEY_LATITUDE);
            theLon = parser.getValue(e, KEY_LONGITUDE);

            //...

            createNewMarkerAndCircle();

      //...

到目前为止,一切正常,地图上会创建标记和圆圈。

我的目的是当地图上的用户进入其中一个圆圈的半径范围内时,获取内部标记的数据。 我告诉你我在做什么:

我有一个我的位置的监听器,每次更新时,检查距离当前位置和圆的半径的距离。

  GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
            @Override
            public void onMyLocationChange(Location location) {
                LatLng loc = new LatLng(location.getLatitude(), location.getLongitude());

                float[] distance = new float[2];

                try {

                    Location.distanceBetween(
                            location.getLatitude(),
                            location.getLongitude(),
                            aCircle.getCenter().latitude,
                            aCircle.getCenter().longitude, distance);

                    if (distance[0] > aCircle.getRadius()) {

                        Log.i("myLogs", "Outside");

                    } else {

                        String markerTitle;
                        markerTitle = aMarker.getTitle();

                        Log.i("myLogs", "I´ in the circle" + " " + markerTitle);

                    }
          //....

这很好用,但问题很严重。

当我开始行走路线时,仅在我进入从xml解析的最后一个“地点”时检测到,因此,最后一个标记和圆圈被创建。

我明白问题是什么,创建的最后一个标记(Marker aMarker;)和圆圈(Circle aCircle;)是指定值的那些...但我不知道如何修复它。

我很感激任何帮助,几天前我正在寻找解决方案,但没有成功。

谢谢和问候。

更多信息:

我发现了另一种方式,但问题仍然完全相同:

https://gist.github.com/saxman/5347195

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我认为你犯了错误createNewMarkerAndCircle(),当更新地图只显示最后一个实例时,请制作MarkerOptions和Circle local else,这就是只有最后一个圆圈显示的原因。

public void createNewMarkerAndCircle() {

    //...

     MarkerOptions aMarker = mMap.addMarker(new MarkerOptions()
                    .position(new LatLng(dLat, dLon))
                    .title(nombre_punto)
                    .snippet(introduccion_punto)
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));


     Circle     aCircle = mMap.addCircle(new CircleOptions()
                            .center(new LatLng(dLat, dLon))
                            .radius(150)
                            .strokeColor(Color.RED)

}

答案 2 :(得分:0)

  

最后一个标记(Marker aMarker;)和圆圈(Circle aCircle;)   创建的是具有指定值的那些......但我不知道如何   解决它。

为了检查你创建的所有兴趣点的距离,你需要将它们保存在某种结构中,最简单的是列表,以便稍后在听众中引用它们:

Marker aMarker;
Circle aCircle;
// this will hold the circles
List<Circle> allCircles = new ArrayList<Circle>();
// this will hold the markers
List<Marker> allMarkers = new ArrayList<Marker>();

public void createNewMarkerAndCircle() {
     aMarker = mMap.addMarker(new MarkerOptions()
            .position(new LatLng(dLat, dLon))
            .title(nombre_punto)
            .snippet(introduccion_punto)
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE   )));
    // store the new marker in the above list 
    allMarkers.add(aMarker);
   aCircle = mMap.addCircle(new CircleOptions()
            .center(new LatLng(dLat, dLon))
            .radius(150)
            .strokeColor(Color.RED)
   // store the created circles
   allCircles.add(aCircle);
}

// in the LocationListener iterate over all stored circles and check the distances against each one of them
// as you add the circles and markers in the same method you'll have a correspondence between them in the two lists
// another sensible approach would be to create a custom Area class
// to hold both the Marker and the circle in one single place
// so when you find yourself inside a circle the marker will be at the same position in allMarkers
for (int i = 0; i < allCircles.size(); i++) {
      Circle c = allCircles.get(i);
      Location.distanceBetween(location.getLatitude(),    location.getLongitude(), c.getCenter().latitude, c.getCenter().longitude,  distance);
     if (distance[0] > c.getRadius()) {
        Log.i("myLogs", "Outside");
     } else {
        String markerTitle;
        markerTitle = allMarkers.get(i).getTitle();
        Log.i("myLogs", "I´ in the circle" + " " + markerTitle);
       // you found a circles so you may want to break out of the for  loop, break; 
}