数据可视化

热力图

热力图通过地图颜色的变化趋势,直观地展现点数据的数据分布特征。

静态热力图

ArrayList<ChartPoint> mheatDatas = new ArrayList<ChartPoint>();
//从数据集中读取数据(数据可视化仅限点数据)
Recordset rd = ((DatasetVector)m_workspace.getDatasources().get(0).getDatasets().get("高等院校")).getRecordset(false, CursorType.DYNAMIC);
while (!rd.isEOF()) {
  Point2D point = rd.getGeometry().getInnerPoint();
  mheatDatas.add(new ChartPoint(point,50));//权重值可根据点的类型不同设置为不同的值
  rd.moveNext();
}
rd.dispose();
HeatMap mheatChart = new HeatMap(this,m_mapView);
mheatChart.setRadious(13); //设置热力图圆点半径,单位dp, 默认20
mheatChart.setSmoothTransColor(true);//设置使用渐变显示,即不同分段颜色显示时平滑过渡
mheatChart.addChartDatas(mheatDatas);//添加统计数据
mheatChart.setTitle("热力图");//设置图表的标题
//以下设置为可选设置,不设置则显示默认效果
ChartLegend chartLegend = mheatChart.getLegend();//获取图表关联的图例
chartLegend.setAlignment(ChartLegend.BOTTOM);//设置图例位置(默认右下)
chartLegend.setOrient(false);//设置横向排列图例(默认纵向)
ColorScheme colorScheme = new ColorScheme();
float[] ranges = new float[]{0,50,200,500,1000};
colorScheme.setSegmentValue(ranges);   //设置图例范围
colorScheme.setColors(new Color[]{//设置显示颜色(注意:颜色必须与范围的个数一致,否则设置失败,显示默认的风格)
  (new Color(116,49,142)),(new Color(230,0,39)),
  (new Color(240,131,43)),(new Color(255,226,40)),
  (new Color(255,255,255))

});
try {
  mheatChart.setColorScheme(colorScheme);//设置图例的颜色表
}catch (Exception e){

}
图:热力图

实时热力图

Timer realTimer = new Timer();
realTimer.schedule(new TimerTask() {
  @Override
  public void run() {
    ArrayList<ChartPoint> mheatDatas = new ArrayList<ChartPoint>();
    ……//数据读取过程省略
    m_heatChart.addChartDatas(mheatDatas);
  }
},50,2000);
m_heatChart.setUpdataInterval(2.0f);// 实时数据更新间隔时间

时空热力图

第一步:在资源文件中添加时间轴控件

<FrameLayout
    android:id="@+id/layout_timeline"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="8dp"
    android:layout_marginLeft="70dp"
    android:layout_marginRight="70dp"
    android:layout_centerHorizontal="true"
    android:layout_width="match_parent"
    android:layout_height="55dp">
</FrameLayout>

第二步:功能实现。

int nSteps = 16;//时间轴上时间点的个数
ArrayList<ChartPoint>  mheatDatas = new ArrayList<ChartPoint> ();
for(int j=0;j<nSteps;j++){
  ……//数据读取过程省略
  m_heatChart.insertChartDataset(mheatDatas,String.valueOf(nSteps-j)+"h",0); //插入统计数据表
}
m_heatChart.setPlayInterval(1.0f);// 渲染时空数据
m_heatChart.setIsLoopPlay(true); //设置循环播放
FrameLayout frameLayoutLayout = (FrameLayout)findViewById(R.id.layout_timeline);   
frameLayoutLayout.setVisibility(View.VISIBLE);
TimeLine  timeLine = new TimeLine(frameLayoutLayout,this);
timeLine.addChart(m_heatChart);// 添加时间轴关联图表
timeLine.load();//加载时间轴
m_heatChart.startPlay();//开启渲染时空数据
图:时空热力图

格网热力图

格网热力图,通过网格和不同的颜色直观展现点数据的空间分布与统计特征。

静态格网热力图

ArrayList <ChartPoint> mGridDatas = new ArrayList<ChartPoint>();
Recordset rd = ((DatasetVector)m_workspace.getDatasources().get(0).getDatasets().get("科教文化服务")).getRecordset(false, CursorType.DYNAMIC);
while (!rd.isEOF()) {
Point2D point = rd.getGeometry().getInnerPoint();
    mGridDatas.add(new ChartPoint(point,0));
    rd.moveNext();
}
rd.dispose();
GridHotChart mGridChart = new GridHotChart(this,m_mapView);
mGridChart.addChartDatas(mGridDatas);//添加统计数据
mGridChart.setTitle("格网热力图");//设置图表的标题
float[] ranges = new float[]{1,5,10};
ColorScheme colorScheme = new ColorScheme();
colorScheme.setSegmentValue(ranges);//设置图例范围
colorScheme.setColors(new Color[]{//设置显示颜色
        (new Color(126,0,35)),(new Color(102,0,153)),
        (new Color(255,153,51))
});
try {
mGridChart.setColorScheme(colorScheme);//设置图例的颜色表
}catch (Exception e){
}
图:静态格网热力图

实时格网热力图

Timer realTimer = new Timer();
realTimer.schedule(new TimerTask() {
@Override
    public void run() {
        Random rand = new Random();
        int nCount = 5000 + rand.nextInt(m_gridDatas.size()+5000);
        ArrayList<ChartPoint> mGridDatas = new ArrayList<ChartPoint>();
               ……//数据读取过程省略

        m_gridChart.addChartDatas(mGridDatas);
    }
},50,2000);
m_gridChart.setUpdataInterval(2.0f); // 实时数据更新间隔时间

时空格网热力图

第一步:在资源文件中添加时间轴控件(同“时空热力图”,略)。

第二步:功能实现。

int nSteps = 12;//时间轴上时间点的个数
for(int j=0;j<nSteps;j++){
ArrayList<ChartPoint> mGridDatas = new ArrayList<ChartPoint>();
  ……//数据读取过程省略
  m_gridChart.insertChartDataset(mGridDatas,String.valueOf(nSteps-j)+"月",0);// 插入统计数据表
}
m_gridChart.setPlayInterval(1.0f);// 渲染时空数据
m_gridChart.setIsLoopPlay(true); //设置循环播放
FrameLayout frameLayoutLayout = (FrameLayout) findViewById(R.id.layout_timeline);
frameLayoutLayout.setVisibility(View.VISIBLE);
TimeLine timeLine = new TimeLine(frameLayoutLayout,this);
timeLine.addChart(m_gridChart);// 添加时间轴关联图表
timeLine.load();//加载时间轴
m_gridChart.startPlay();//开启渲染时空数据 
图:时空格网热力图

密度图

密度图能够渲染海量数据点,并根据密集程度呈现颜色的变化。

静态密度图

ArrayList<ChartPoint> mDensityDatas = new ArrayList<ChartPoint>();
Recordset rd = ((DatasetVector)m_workspace.getDatasources().get(0).getDatasets().get("point")).getRecordset(false, CursorType.DYNAMIC);
while (!rd.isEOF()) {
      Point2D point = rd.getGeometry().getInnerPoint();
      mDensityDatas.add(new ChartPoint(point,0));
      rd.moveNext();
}
rd.dispose();
PointDensityChart mDensityChart = new PointDensityChart(this,m_mapView);
mDensityChart.setRadious(4);//设置原始点半径,默认3
mDensityChart.addChartDatas(mDensityDatas); //添加统计数据
mDensityChart.setTitle("密度图");//设置图表的标题
float[] ranges = new float[]{1,3,10};
ColorScheme colorScheme = new ColorScheme();
colorScheme.setSegmentValue(ranges); //设置图例范围
colorScheme.setColors(new Color[]{//设置显示颜色
       (new Color(174,221,129)), (new Color(107,194,53)),
        (new Color(6,128,67))
});
try {
      mDensityChart.setColorScheme(colorScheme); //设置图例的颜色表
}catch (Exception e){
}
图:静态密度图

实时密度图

Timer realTimer = new Timer();
realTimer.schedule(new TimerTask() {
    @Override
    public void run() {
       ArrayList<ChartPoint> mDensityDatas = new ArrayList<ChartPoint>();
      ……//数据读取过程省略
       m_densityChart.addChartDatas(mDensityDatas);
    }
},50,2000);
m_densityChart.setUpdataInterval(5.0f); //实时数据更新间隔时间

时空密度图

第一步:在资源文件中添加时间轴控件(同“时空热力图”,略)。

第二步:功能实现。

int nSteps = 10;//时间轴上时间点的个数
for(int j=0;j<nSteps;j++){
  ArrayList<ChartPoint>  mDensityDatas = new ArrayList<ChartPoint>();
  ……//数据读取过程省略
  m_densityChart.insertChartDataset(mDensityDatas,String.valueOf(nSteps-j)+"d",0);

}
m_densityChart.setPlayInterval(1.0f); // 渲染时空数据
m_densityChart.setIsLoopPlay(true); //设置循环播放
FrameLayout frameLayoutLayout = (FrameLayout) findViewById(R.id.layout_timeline);
frameLayoutLayout.setVisibility(View.VISIBLE);
TimeLine timeLine = new TimeLine(frameLayoutLayout,this);
timeLine.addChart(m_densityChart); // 添加时间轴关联图表
timeLine.load();//加载时间轴
m_densityChart.startPlay();//开启渲染时空数据
图:时空密度图

聚合图

聚合图能够将高密度的散点抽稀,聚合显示。

静态聚合图

ArrayList<ChartPoint> mPolymerDatas = new ArrayList<ChartPoint>();
Recordset  rd = ((DatasetVector)m_workspace.getDatasources().get(0).getDatasets().get("名胜景点")).getRecordset(false, CursorType.DYNAMIC);
while (!rd.isEOF()) {
  Point2D point = rd.getGeometry().getInnerPoint();
  mPolymerDatas.add(new ChartPoint(point,0));
  rd.moveNext();
}
rd.dispose();
PolymerChart mPolymerChart = new PolymerChart(this,m_mapView);
mPolymerChart.setMaxRadious(45);//设置聚合点显示最大半径,默认60
mPolymerChart.addChartDatas(mPolymerDatas);//添加统计数据
mPolymerChart.setTitle("聚合图");//设置图表的标题
float[] ranges = new float[]{1,5,20,50,500,2000};
ColorScheme colorScheme = new ColorScheme();
colorScheme.setSegmentValue(ranges);//设置图例范围
colorScheme.setColors(new Color[]{//设置显示颜色
        (new Color(222,156,83)),(new Color(222,211,140)),
        (new Color(201,186,131)),(new Color(137,190,178)),
        (new Color(113,57,53)), (new Color(117,27,19))
});
try {
  mPolymerChart.setColorScheme(colorScheme);//设置图例的颜色表
}catch (Exception e){
}
图:静态聚合图

实时聚合图

Timer realTimer = new Timer();
realTimer.schedule(new TimerTask() {
@Override
    public void run() {
        ArrayList<ChartPoint> arrTmp = new ArrayList<ChartPoint>();
		……//数据读取过程省略
		m_polymerChart.addChartDatas(arrTmp);
    }
},50,2000);
m_polymerChart.setUpdataInterval(2.0f); // 实时数据更新间隔时间

时空聚合图

第一步:在资源文件中添加时间轴控件(同“时空热力图”,略)。

第二步:功能实现。

int nSteps = 24;//时间轴上时间点的个数
for(int j=0;j<nSteps;j++){
	ArrayList<ChartPoint>  mPolymerDatas = new ArrayList<ChartPoint>();
	……//数据读取过程省略
	m_polymerChart.insertChartDataset(mPolymerDatas,String.valueOf(nSteps-j)+"h",0);// 插入统计数据表
}
m_polymerChart.setPlayInterval(1.0f);// 渲染时空数据
m_polymerChart.setIsLoopPlay(true);//设置循环播放
FrameLayout frameLayoutLayout = (FrameLayout) findViewById(R.id.layout_timeline);
frameLayoutLayout.setVisibility(View.VISIBLE);
TimeLine timeLine = new TimeLine(frameLayoutLayout,this);
timeLine.addChart(m_polymerChart);
timeLine.load();//加载时间轴
m_polymerChart.startPlay();//开启渲染时空数据
图:时空聚合图

关系图

关系图以关系线的形式反映对象之间的关联。

静态关系图

ArrayList<RelationalChartPoint> m_relativeDatas = new ArrayList<RelationalChartPoint>();
Recordset rd = ((DatasetVector) m_workspace.getDatasources().get(0).getDatasets().get("point")).getRecordset(false, CursorType.DYNAMIC);
while (!rd.isEOF()) {
    Point2D point = rd.getGeometry().getInnerPoint();
    RelationalChartPoint relPoint = new RelationalChartPoint(point, 0);
    relPoint.setRelationName((String) rd.getFieldValue("name"));
	m_relativeDatas.add(relPoint);
	rd.moveNext();
}
rd.dispose();
ArrayList<RelationalChartPoint> targetArr = new ArrayList<RelationalChartPoint>();
//创建关系点
for(int i = 0;i<m_relativeDatas.size();i++)
{
    RelationalChartPoint relPoint = m_relativeDatas.get(i);
	relPoint.getRelationalPoints().clear();
	String name = relPoint.getRelationName();
	if(
		name.equalsIgnoreCase("北京大学") ||
		name.equalsIgnoreCase("复旦大学") ||
		name.equalsIgnoreCase("中山大学") ||
		name.equalsIgnoreCase("四川大学") ||
		name.equalsIgnoreCase("新疆大学") ||
		name.equalsIgnoreCase("湖南大学") ||
		name.equalsIgnoreCase("内蒙古大学") ||
		name.equalsIgnoreCase("云南大学")
     ){
		targetArr.add(relPoint);
     }
}
//创建关系线
for(int j=0;j<targetArr.size();j++){
   RelationalChartPoint relPoint = targetArr.get(j);
   for(int k=0;k<targetArr.size();k++)
   {
      RelationalChartPoint relPoint1 = targetArr.get(k);
      if(relPoint1.getRelationName().equalsIgnoreCase("北京大学")){
         relPoint1.setWeighted(50);
          }else if(relPoint1.getRelationName().equalsIgnoreCase("复旦大学")){
         relPoint1.setWeighted(45);
          }else if(relPoint1.getRelationName().equalsIgnoreCase("中山大学")){
         relPoint1.setWeighted(36);
          }else if(relPoint1.getRelationName().equalsIgnoreCase("四川大学")){
         relPoint1.setWeighted(40);
      }else if(relPoint1.getRelationName().equalsIgnoreCase("湖南大学")){
         relPoint1.setWeighted(50);
   } if(relPoint1.getRelationName().equals(relPoint.getRelationName())==false){
            relPoint.getRelationalPoints().add(relPoint1);
          }
       }
   }      
Resources res = MainActivity.this.getResources();
Bitmap bmp= BitmapFactory.decodeResource(res, R.drawable.icon_plan);
m_relationChart = new RelationPointChart(this,m_mapView);
m_relationChart.setIsAnimation(true);// 设置开启动画效果
m_relationChart.setLineWidth(0.75f);// 设置关系线宽度
m_relationChart.setMaxRadious(30);// 设置关系点显示最大半径
m_relationChart.setAnimationImage(bmp);//设置沿关系线移动的图形
m_relationChart.addChartRelationDatas(targetArr);//添加关系点数据集
m_relationChart.setTitle("关系图");//设置标题
ColorScheme colorScheme = new ColorScheme();
colorScheme = m_relationChart.getColorScheme();
colorScheme.setColors(new Color[]{
     (new Color(23,44,60)),(new Color(39,72,98)),
     (new Color(153,80,84)),(new Color(217,104,49)),
     (new Color(230,179,61)),(new Color(248,134,137))
    });
    try {
         m_relationChart.setColorScheme(colorScheme);
    }catch (Exception e){
}
图:静态关系图

实时关系图

Timer realTimer = new Timer();
realTimer.schedule(new TimerTask() {
	@Override
    public void run() {
        ArrayList<ChartPoint> arrTmp = new ArrayList<ChartPoint>();
        ……//数据读取过程省略
        m_relationChart.addChartDatas(arrTmp);
    }
},50,2000);
m_relationChart.setUpdataInterval(2.0f); // 实时数据更新间隔时间

时空关系图

第一步:在资源文件中添加时间轴控件(同“时空热力图”,略)。

第二步:功能实现。

int nSteps = 12;
for(int j=0;j<nSteps;j++){
	ArrayList<ChartPoint>  arrTmp = new ArrayList<ChartPoint>();
	……//数据读取过程省略
	m_relationChart.insertChartDataset(arrTmp,String.valueOf(nSteps-j)+"月",0);
}
m_relationChart.setPlayInterval(1.0f);
m_relationChart.setIsLoopPlay(true);
FrameLayout frameLayoutLayout = (FrameLayout) findViewById(R.id.layout_timeline);
frameLayoutLayout.setVisibility(View.VISIBLE);
TimeLine timeLine = new TimeLine(frameLayoutLayout,this);
timeLine.addChart(m_relationChart);
timeLine.load();
m_relationChart.startPlay();
图:时空关系图