如何在Google Map API v2中的MapFragment上显示多个标记?

我在我的应用程序中使用Google Map API v2来显示地图。

我已按照所有步骤进行操作,以便在我的应用程序中启用Google Map。

 public class PinLocationOnMapView extends FragmentActivity { private double mLatitude = 0.0, mLongitude = 0.0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SupportMapFragment fragment = SupportMapFragment.newInstance(); getSupportFragmentManager().beginTransaction() .add(android.R.id.content, fragment).commit(); } } 

如果我使用此代码,它会显示我的地图,但如果我提供我的纬度/经度值,则地图图块不会加载,我只看到白色图块。

以下是上述类的onCreate()中编写的代码:

  if (getIntent().getExtras() != null) { final Bundle bundle = getIntent().getBundleExtra("LOCATION"); mLatitude = bundle.getDouble("LATITUDE"); mLongitude = bundle.getDouble("LONGITUDE"); } else { finish(); } GoogleMapOptions options = new GoogleMapOptions(); LatLng latLng = new LatLng(mLatitude, mLongitude); CameraPosition cameraPosition;// = new CameraPosition(latLng, 0, 0, 0); cameraPosition = CameraPosition.fromLatLngZoom(latLng, (float) 14.0); options.mapType(GoogleMap.MAP_TYPE_SATELLITE).camera(cameraPosition) .zoomControlsEnabled(true).zoomGesturesEnabled(true); SupportMapFragment fragment = SupportMapFragment.newInstance(options); getSupportFragmentManager().beginTransaction() .add(android.R.id.content, fragment).commit(); 

另外,我有一个lat / long值列表。 我想在MapFragment上显示它们, 如何MapFragment 上显示多个标记

我尝试使用MapViewItemizedOverlay ,但它对我不起作用。 我相信我已经正确创建了SHA1密钥以获取API密钥,因为如果这是错误的,我也无法使用MapFragment看到地图,但我可以看到,如果我没有传递lat / log值。

我是这样做的,用不同颜色的标记在地图上显示汽车位置:

  private void addMarkersToMap() { mMap.clear(); for (int i = 0; i < Cars.size(); i++) { LatLng ll = new LatLng(Cars.get(i).getPos().getLat(), Cars.get(i).getPos().getLon()); BitmapDescriptor bitmapMarker; switch (Cars.get(i).getState()) { case 0: bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED); Log.i(TAG, "RED"); break; case 1: bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN); Log.i(TAG, "GREEN"); break; case 2: bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE); Log.i(TAG, "ORANGE"); break; default: bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED); Log.i(TAG, "DEFAULT"); break; } mMarkers.add(mMap.addMarker(new MarkerOptions().position(ll).title(Cars.get(i).getName()) .snippet(getStateString(Cars.get(i).getState())).icon(bitmapMarker))); Log.i(TAG,"Car number "+i+" was added " +mMarkers.get(mMarkers.size()-1).getId()); } } } 

Cars是自定义对象的ArrayList ,mMarkers是标记的ArrayList

注意:您可以像这样在片段中显示地图:

 private GoogleMap mMap; .... private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the // map. if (mMap == null) { // Try to obtain the map from the SupportMapFragment. mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); // Check if we were successful in obtaining the map. if (mMap != null) { setUpMap(); } } } private void setUpMap() { // Hide the zoom controls as the button panel will cover it. mMap.getUiSettings().setZoomControlsEnabled(false); // Add lots of markers to the map. addMarkersToMap(); // Setting an info window adapter allows us to change the both the // contents and look of the // info window. mMap.setInfoWindowAdapter(new CustomInfoWindowAdapter()); // Set listeners for marker events. See the bottom of this class for // their behavior. mMap.setOnMarkerClickListener(this); mMap.setOnInfoWindowClickListener(this); mMap.setOnMarkerDragListener(this); // Pan to see all markers in view. // Cannot zoom to bounds until the map has a size. final View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView(); if (mapView.getViewTreeObserver().isAlive()) { mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @SuppressLint("NewApi") // We check which build version we are using. @Override public void onGlobalLayout() { LatLngBounds.Builder bld = new LatLngBounds.Builder(); for (int i = 0; i < mAvailableCars.size(); i++) { LatLng ll = new LatLng(Cars.get(i).getPos().getLat(), Cars.get(i).getPos().getLon()); bld.include(ll); } LatLngBounds bounds = bld.build(); mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 70)); mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this); } }); } } 

只需在onCreate()调用setUpMapIfNeeded() onCreate()

要在使用geoCoder将地址(即123 Testing Street Lodi ca)转换为LatLng时添加多个标记以进行映射,下面的示例代码将起作用。

 // convert address to lng lat and add markers to map public void addMarkersToMap() { mMap.clear(); Double[] latitude = new Double[addressArrayList.size()]; Double[] longitude = new Double[addressArrayList.size()]; String[] addrs = new String[addressArrayList.size()]; addrs = addressArrayList.toArray(addrs); List
addressList; if (addrs != null && addrs.length > 0) { for (int i = 0; i < addrs.length; i++) { try { addressList = geoCoder.getFromLocationName(addrs[i], 1); if (addressList == null || addressList.isEmpty() || addressList.equals("")) { addressList = geoCoder.getFromLocationName("san francisco", 1); } latitude[i] = addressList.get(0).getLatitude(); longitude[i] = addressList.get(0).getLongitude(); System.out.println("latitude = " + latitude[i] + " longitude = " + longitude[i]); mMap.addMarker(new MarkerOptions() .position(new LatLng(latitude[i], longitude[i])) .title(namesArrayList.get(i)) .snippet(addressArrayList.get(i)) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)) .alpha(0.7f) ); } catch (Exception e) { e.printStackTrace(); } // end catch } } } //end addMarkersToMap

我不知道也许你修复了代码,现在没关系,但是在onCreate()

 if (getIntent().getExtras() != null) { final Bundle bundle = getIntent().getBundleExtra("LOCATION"); mLatitude = bundle.getDouble("LATITUDE"); mLatitude = bundle.getDouble("LONGITUDE"); } 

我认为它必须是mLongitude ,就像你在下一行中调用它一样。

对不起,如果我迟到的答案,没用。

尝试使用此代码调用您网站根目录中的xml文件 –

添加标记的一种方法是加载位于根目录下的xml文件(请参阅下面的代码),其中包含标记html。

此处的代码设置地图空间和侧栏列以保存地图和标记的链接。 请注意,带有id的div标签和用于html和map项的side-bar td id。

您可以设置标记,但请注意需要使用必须正确标记的特殊字符; 例如,&符号(&)实际应编码为“&”+“amp”+“;” (没有引号)。 这同样适用于大于和小于字符,依此类推。 如果你有几个标记,这是一件苦差事,但一旦到位,它就很容易改变,因为它不需要在应用程序内部构建或编码任何程序集。 在读取文件的脚本中,技术上使用CDATA标记应该不需要使用特殊字符表示,但对于Gmaps API v2,我仍然使用它们。 对于我的示例,xml文件名是example3.xml。

您可以像这样格式化xml:

    And for the html and script: 

//]]>

第一个方法setupDestationLocation

  public void setupDestationLocation(double longlat, double latitue, String title) { LatLng Shop = new LatLng(longlat, latitue); /* if (DestinationMarker != null) { DestinationMarker.remove(); }*/ DestinationMarker = mMap.addMarker(new MarkerOptions() .position(Shop) .title(market_n) .title(title) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_marker_shop))); CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(Shop, 14); mMap.animateCamera(cameraUpdate); } 

现在只需在方法内部调用方法( onMapReady

 String title = "market"; for(int i = 0 ; i < 8 ; i++ ) { double offset = i / 08d; setupDestationLocation(longlat+offset,latitue,title+i); }