带有自定义标记的Android地图(标记上的文字)

时间:2016-05-24 05:53:57

标签: android google-maps marker

我以前从未在地图api上工作过。我想实现如下图所示的地图。我从Web服务获取数据,使用该数据我可以将事件计数显示在标记上。 基本功能是,一旦用户放大,地图标记将会扩展,因此标记会计数。

enter image description here

我的问题是:

  1. 有没有办法像这样自定义标记。
  2. 如何在放大,缩小事件时处理标记计数。
  3. 请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您无需执行任何操作来计算标记并显示其在图片中的显示方式。 Google有一个名为Google Maps Android API utility library

的库

你需要的那个叫做

  

标记聚类 - 处理大量点的显示。 video

答案 1 :(得分:0)

Android-Maps-Utils具有Marker Clustering Utility。以下是步骤:

  1. 在build.gradle中添加compile 'com.google.maps.android:android-maps-utils:0.4.3'

  2. 在您的清单中添加以下权限

    <uses-permission android:name="your.package.permission.MAPS_RECEIVE"/>
    
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
  3. 创建一个类,使您可以将标记的位置设置为LatLng Object。

    公共类MarkerItem实现ClusterItem {

    private final LatLng mPosition;
    
    public MarkerItem (double lat, double lon) {
        mPosition = new LatLng(lat, lon);
    }
    
    @Override
    public LatLng getPosition() {
        return mPosition;
    }
    
  4. 在Activity / Fragment

    中添加ClusterManager

    公共类MainActivity扩展FragmentActivity实现OnMapReadyCallback {

    private GoogleMap mGoogleMap;
    
    // Declare a variable for the cluster manager.
    ClusterManager<MarkerItem> mClusterManager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
    
        setContentView(R.layout.activity_main);
    
        SupportMapFragment supportMapFragment =
                (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    
        supportMapFragment.getMapAsync(this);
    }
    
    @Override
    public void onMapReady(GoogleMap googleMap) {
    
        mGoogleMap = googleMap;
    
        setUpClusterer();
    }
    
    private void setUpClusterer() {
    
        // Position the map.
        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446), 10));
    
        // Initialize the manager with the context and the map.
        // (Activity extends context, so we can pass 'this' in the constructor.)
        mClusterManager = new ClusterManager<>(this, mGoogleMap);
    
        // Point the map's listeners at the listeners implemented by the cluster
        // manager.
        mGoogleMap.setOnCameraChangeListener(mClusterManager);
        mGoogleMap.setOnMarkerClickListener(mClusterManager);
    
        // Add cluster items (markers) to the cluster manager.
        addItems();
    }
    
    /**
     * Generate dummy coordinates
     */
    private void addItems() {
    
        // Set some lat/lng coordinates to start with.
        double lat = 51.5145160;
        double lng = -0.1270060;
    
        // Add ten cluster items in close proximity, for purposes of this example.
        for (int i = 0; i < 10; i++) {
            double offset = i / 60d;
            lat = lat + offset;
            lng = lng + offset;
            MarkerItem offsetItem = new MarkerItem(lat, lng);
            mClusterManager.addItem(offsetItem);
        }
    }
    
  5. 此库自动处理群集部分。

    我希望这会有所帮助!

    详细信息:请关注this link