package com.sb.service.impl;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.sb.entity.SG_GROUPINDEX;
import com.sb.entity.SG_PIPEPOINT;
//聚合类 不同的地图级别聚合的距离不一样,每一个地图级别都对应一个聚合结果
public class MarkerClusterer {
public MarkerClusterer() {
}
protected int total;
//创建聚合
//points 点集
//dis 聚合距离
//return clusters 聚合点集合
public List<SG_GROUPINDEX> createClusterer(List<SG_PIPEPOINT> points,double dis,int zoom,String thisDay) {
//List<SG_PIPEPOINT> points,double dis,int zoom,String thisDay
List<SG_GROUPINDEX> clusters= new ArrayList<SG_GROUPINDEX>();
for(int i=0;i<points.size();i++) {
boolean incluster=false;
SG_PIPEPOINT tmpPT=points.get(i);
for(int j=0;j<clusters.size();j++){
//在指定的聚合距离(dis)之内
if(this.getDistance(clusters.get(j).getCenterx(),clusters.get(j).getCentery(),tmpPT)<dis){
if(clusters.get(j).getMinX()>tmpPT.getJd()) clusters.get(j).setMinX(tmpPT.getJd());
if(clusters.get(j).getMaxX()<tmpPT.getJd()) clusters.get(j).setMaxX(tmpPT.getJd());
if(clusters.get(j).getMinY()>tmpPT.getWd()) clusters.get(j).setMinY(tmpPT.getWd());
if(clusters.get(j).getMaxY()<tmpPT.getWd()) clusters.get(j).setMaxY(tmpPT.getWd());
clusters.get(j).addNum();
incluster=true;
break;
}
}
if(!incluster) //否则就单独创建一个聚合点
{
clusters.add(this.createCluster(tmpPT,dis,zoom,thisDay));
}
}
return clusters;
}
//创建一个聚合
private SG_GROUPINDEX createCluster(SG_PIPEPOINT p,double dis,int zoom,String thisDay)
{
SG_GROUPINDEX cluster=new SG_GROUPINDEX();
cluster.setNum(1);
cluster.setCenterx(p.getJd());
cluster.setCentery(p.getWd());
cluster.setMinX(p.getJd());
cluster.setMinY(p.getJd());
cluster.setMaxX(p.getWd());
cluster.setMaxY(p.getWd());
cluster.setDis(dis);
cluster.setZoom(zoom);
cluster.setCreatetime(thisDay);
return cluster;
}
//计算两点之间的距离
private double getDistance(double x,double y,SG_PIPEPOINT point2){
double pk = 180 / 3.14169 ;
double a1 = y / pk ;
double a2 = x / pk ;
double b1 = point2.getWd() / pk ;
double b2 = point2.getJd() / pk ;
double t1 =Math.cos(a1) * Math.cos(a2) * Math.cos(b1) * Math.cos(b2) ;
double t2 = Math.cos(a1) * Math.sin(a2) * Math.cos(b1) * Math.sin(b2) ;
double t3 = Math.sin(a1) * Math.sin(b1);
double tt = Math.acos(t1 + t2 + t3);
return 6366000 * tt;
}
}