【Android】3.10 热力图功能

分类:C#、Android、VS2015、百度地图应用; 创建日期:2016-02-04

一、简介

热力图是用不同颜色的区块叠加在地图上描述人群分布、密度和变化趋势的一个产品,可利用自有数据,构建属于自己的热力图,为用户提供丰富的展示效果。

二、运行截图

简介:绘制自有数据热力图

详述:

(1)设置热力图颜色;

(2)准备数据、生成热力图;

(3)删除热力图;

本示例运行截图如下:

注意:由于.json文件包含的是全国范围的数据,单线程的加载过程非常慢(约10分钟左右),需要耐心等待。一旦数据加载完毕,再进行添加、删除操作就很快了。

当【添加】按钮变为可用时,单击它即可看到截图的效果。

image

三、设计步骤

1、添加demo10_heatmap.xml文件

在layout文件夹下添加该文件,然后将代码改为下面的内容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/add"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginBottom="2dip"
            android:layout_marginLeft="2dip"
            android:layout_marginRight="2dip"
            android:layout_marginTop="2dip"
            android:layout_weight="1"
            android:padding="10dip"
            android:text="添加" />

        <Button
            android:id="@+id/remove"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginBottom="2dip"
            android:layout_marginLeft="2dip"
            android:layout_marginRight="2dip"
            android:layout_marginTop="2dip"
            android:layout_weight="1"
            android:text="删除" />
    </LinearLayout>

    <com.baidu.mapapi.map.TextureMapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>

 

2、添加Demo10HeatMap.cs文件

在SrcSdkDemos文件夹下添加该文件,然后将代码改为下面的内容:

using Android.App;
using Android.Content.PM;
using Android.OS;
using Android.Widget;
using Com.Baidu.Mapapi.Map;
using Com.Baidu.Mapapi.Model;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace BdMapV371Demos.SrcSdkDemos
{
    /// <summary>
    /// 热力图功能demo
    /// </summary>
    [Activity(Label = "@string/demo_name_heatmap",
        ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden,
        ScreenOrientation = ScreenOrientation.Sensor)]
    public class Demo10HeatMap : Activity
    {
        private TextureMapView mMapView;
        private BaiduMap mBaiduMap;
        private HeatMap heatmap;
        private Button mAdd;
        private Button mRemove;
        private bool isDestroy;

        private List<LatLng> data;

        protected async override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.demo10_heatmap);

            mMapView = FindViewById<TextureMapView>(Resource.Id.mapview);
            mBaiduMap = mMapView.Map;
            mBaiduMap.SetMapStatus(MapStatusUpdateFactory.ZoomTo(5));

            mAdd = FindViewById<Button>(Resource.Id.add);
            mRemove = FindViewById<Button>(Resource.Id.remove);
            mAdd.Enabled = false;
            mRemove.Enabled = false;
            mAdd.Click += delegate
            {
                AddHeatMap();
            };
            mRemove.Click += delegate
            {
                heatmap.RemoveHeatMap();
                mAdd.Enabled = true;
                mRemove.Enabled = false;
            };

            await Task.Run(() =>
            {
                data = new List<LatLng>();
                var stream = Resources.OpenRawResource(Resource.Raw.locations);
                string json = new Java.Util.Scanner(stream).UseDelimiter("\\A").Next();
                try
                {
                    Org.Json.JSONArray array = new Org.Json.JSONArray(json);
                    for (int i = 0; i < array.Length(); i++)
                    {
                        Org.Json.JSONObject obj = array.GetJSONObject(i);
                        double lat = obj.GetDouble("lat");
                        double lng = obj.GetDouble("lng");
                        data.Add(new LatLng(lat, lng));
                    }
                }
                catch (Java.Lang.Exception e)
                {
                    e.PrintStackTrace();
                }
            });
            mAdd.Enabled = true;
        }

        private void AddHeatMap()
        {
            mAdd.Enabled = false;
            heatmap = new HeatMap.Builder().Data(data).Build();
            if (!isDestroy)
            {
                mBaiduMap.AddHeatMap(heatmap);
            }
            mRemove.Enabled = true;
        }

        protected override void OnPause()
        {
            base.OnPause();
            mMapView.OnPause();
        }

        protected override void OnResume()
        {
            base.OnResume();
            mMapView.OnResume();
        }

        protected override void OnDestroy()
        {
            base.OnDestroy();
            isDestroy = true;
            mMapView.OnDestroy();
        }
    }
}

3、修改MainActivity.cs

在MainActivity.cs文件的demos字段定义中,去掉【示例10】下面的注释。

运行观察结果。

posted @ 2016-02-04 14:02  rainmj  阅读(3285)  评论(0编辑  收藏  举报