public void updateConnections(List <GridCluster> clusters)
 {
     for (int p = 0; p < this.getNumPoints(); p++)
     {
         MapPoint auxPoint = this.getPoint(p);
         for (int connect = 0; connect < auxPoint.getRelations().Count; connect++)
         {
             for (int clusterConnected = 0; clusterConnected < auxPoint.getRelations()[connect].getTo().getRelatedClusters().Count; clusterConnected++)
             {
                 GridCluster auxCluster = auxPoint.getRelations()[connect].getTo().getRelatedClusters()[clusterConnected];
                 if (auxCluster.getLevel() == 0 && auxCluster != this)
                 {
                     int  levelCluster      = 0;
                     bool clusterLevelFound = false;
                     while (!clusterLevelFound && levelCluster < clusters.Count)
                     {
                         clusterLevelFound = (clusters[levelCluster] == auxCluster);
                         levelCluster++;
                     }
                     if (clusterLevelFound)
                     {
                         connectionsList[levelCluster - 1]++;
                         //Debug.Log("Hay conexión con cluster " + (levelCluster - 1));
                     }
                 }
             }
         }
     }
 }
Beispiel #2
0
        static void PMapTest()
        {
            var b = new Boundary {
                Minx = -180, Maxx = 180, Miny = -90, Maxy = 90
            };
            const int dx = 20;
            const int dy = 20;

            var xy = GridCluster.GetPointMappedIds(new P {
                X = 175, Y = 35
            }, b, dx, dy);

            CWF("x: {0}   y: {1}", xy[0], xy[1]);

            xy = GridCluster.GetPointMappedIds(new P {
                X = 175, Y = 35
            }, b, dx, dy);
            CWF("x: {0}   y: {1}", xy[0], xy[1]);

            xy = GridCluster.GetPointMappedIds(new P {
                X = 180, Y = 35
            }, b, dx, dy);
            CWF("x: {0}   y: {1}", xy[0], xy[1]);

            xy = GridCluster.GetPointMappedIds((new P {
                X = 181, Y = 35
            }).Normalize(), b, dx, dy);
            CWF("x: {0}   y: {1}", xy[0], xy[1]);

            xy = GridCluster.GetPointMappedIds((new P {
                X = -181, Y = 35
            }).Normalize(), b, dx, dy);
            CWF("x: {0}   y: {1}", xy[0], xy[1]);
        }
    protected void arrangeRelatives(MapLevel level, MapLevel lastLevel)
    {
        List <GridCluster> levelClusterList = level.getGridClusters();

        foreach (GridCluster clusterChild in levelClusterList)
        {
            MapPoint childPoint = clusterChild.getPoint(0);

            //Debug.Log("Se llama desde cluster con h=" + clusterChild.hQuad + " y v=" + clusterChild.vQuad);

            int h = lastLevel.getHGrid(clusterChild.hQuad);
            int v = lastLevel.getVGrid(clusterChild.vQuad);

            //List<GridCluster> parentCandidates = lastLevel.getGridClustersPerQuad(h, v);

            GridCluster clusterParent = lastLevel.getClusterWithPoint(childPoint);
            //GridCluster clusterParent = lastLevel.getClusterWithPointInQuad(childPoint);

            if (clusterParent != null)
            {
                clusterChild.setParent(clusterParent);
                clusterParent.addChild(clusterChild);
            }
        }
    }
    public int scaleCorrection(GridCluster cluster, int numPoints, float zoom)
    {
        int scale = getScale(cluster, this.points.Count);

        // Debug.Log(zoom);

        float corrector = 1.0f;

        //int level = clusterManager.getLevel(zoom);

        /*
         * switch (level)
         * {
         *  //zoom > 4 && zoom <= 6)
         *  case 1:
         *      corrector = 2.0f;
         *      break;
         *  //zoom > 6 && zoom <= 8)
         *  case 2:
         *      corrector = 2.5f;
         *      break;
         *  //zoom > 8)
         *  case 3:
         *      corrector = 3.0f;
         *      break;
         * }
         */
        //scale = (int)(scale * corrector);

        //if (!cluster.getCategory().Equals("silknow.org/#pthing"))
        //  scale = scale * 2;


        return(scale);
    }
    private OnlineMapsDrawingLine addConnection(GridCluster clusterFrom, GridCluster clusterTo, int numConnections)
    {
        MapPoint from = clusterFrom.getCenter();
        MapPoint to   = clusterTo.getCenter();


        List <Vector2> points = new List <Vector2>();

        points.Add(from.getVector2());
        points.Add(to.getVector2());



        OnlineMapsDrawingLine oLine = new OnlineMapsDrawingLine(points, Color.blue);

        oLine.width   = 1.0f;
        oLine.visible = true;
        OnlineMapsDrawingElementManager.AddItem(oLine);
        oLine.visible = false;
        oLine.name    = "connection";



        return(oLine);
    }
 public void addChild(GridCluster child)
 {
     if (!this.childs.Contains(child))
     {
         this.childs.Add(child);
     }
 }
Beispiel #7
0
    public void managePoints(GridCluster cluster)
    {
        int             i = 0;
        int             h, v;
        int             auxLevel;
        bool            found;
        List <MapPoint> points = cluster.getPoints();

        //Debug.Log("Managin cluster with " + points.Count);

        int numPoints = points.Count;

        for (i = 0; i < numPoints; i++)
        {
            //h = getHGrid(points[i].getMarker().position.y);
            //v = getVGrid(points[i].getMarker().position.x);

            //h = getHGrid(points[i].getY());
            //v = getVGrid(points[i].getX());

            auxLevel = 0;
            found    = false;

            int numClusters = this.clusters.Count;

            while (!found && auxLevel < numClusters)
            {
                found = this.clusters[auxLevel].checkPoint(points[i].getX(), points[i].getY());// h, v);//,points[i].getCategory());
                auxLevel++;
            }

            if (found)
            {
                this.clusters[auxLevel - 1].addPoint(points[i]);
                points[i].addCluster(this.clusters[auxLevel - 1]);
            }
            else
            {
                h = getHGrid(points[i].getX());
                v = getVGrid(points[i].getY());
                GridCluster newGridCluster = new GridCluster(h, v, points[i], this);
                newGridCluster.setLevel(this.level);
                points[i].addCluster(newGridCluster);

                newGridCluster.setParent(cluster);
                cluster.addChild(newGridCluster);

                this.clusters.Add(newGridCluster);

                //QuadCluster quadC = this.getQuadCluster(h, v);
                //quadC.addCluster(newGridCluster);

                //if (level==0 || level== 1)
                //{
                //  Debug.Log("Se crea quad en nivel " + level + " con h= " + h + " , v=" + v);
                // }
            }
        }
    }
 public GridCluster(GridCluster a)
 {
     this.numFilteredPoints = 0;
     this.points.AddRange(a.getPoints());
     a.setParent(this);
     this.addChild(a);
     this.center = new MapPoint(a.getCenter().getX(), a.getCenter().getY());
 }
Beispiel #9
0
 public void addCluster(GridCluster cluster)
 {
     this.clusterList.Add(cluster);
     if (cluster.getLevel() == 1)
     {
         Debug.Log("Se ha añadido un cluster de nivel 1");
     }
 }
 public GridCluster(GridCluster a, GridCluster b)
 {
     this.numFilteredPoints = 0;
     this.points.AddRange(a.getPoints());
     this.points.AddRange(b.getPoints());
     a.setParent(this);
     b.setParent(this);
     this.addChild(a);
     this.addChild(b);
     this.setAverageCenter(a.getCenter(), b.getCenter());
 }
Beispiel #11
0
    /**
     * Distribute the points that are located in the same longitud,latitud in a circle
     * arround the original location.
     * */
    public void distributeGroupsOnCircle()
    {
        float  incR   = 0.1f;
        double incAng = 6.28f;
        int    level;
        double pointsPerLevel;
        int    pointAtLevel;

        foreach (Vector2 v in positionsGroup.Keys)
        {
            List <MapPoint> pointList = positionsGroup[v];

            if (pointList.Count <= MAX_POINTS_PER_GROUP)
            {
                level          = 0;
                pointAtLevel   = 1;
                pointsPerLevel = Math.Pow(2, level);

                for (int i = 0; i < pointList.Count; i++)
                {
                    if (pointAtLevel > pointsPerLevel)
                    {
                        pointAtLevel = 1;
                        level++;
                        pointsPerLevel = Math.Pow(2, level);
                        incAng         = 6.28f / pointsPerLevel;
                    }

                    double x = v.x + Math.Cos(pointAtLevel * incAng) * incR * level;
                    double y = v.y + Math.Sin(pointAtLevel * incAng) * incR * level;

                    pointList[i].setXY(Convert.ToSingle(x), Convert.ToSingle(y));

                    pointAtLevel++;
                }
            }
            else
            {
                GridCluster gCluster = new GridCluster(pointList);
                gCluster.setCenter(pointList[0]);
                gCluster.groupPoints = true;
                clusterManager.addPointGroup(gCluster);
                foreach (MapPointMarker m in pointList)
                {
                    m.clusteredLevel = true; // xxx
                    m.addCluster(gCluster);  //xxx
                    m.isInGroupPoint = gCluster;
                }
            }
        }
    }
    public GridCluster getClusterByName(String name)
    {
        GridCluster cluster = null;

        int numCluster = Int32.Parse(name);

        int level    = (int)(numCluster / 1000);
        int position = numCluster % 1000;

        List <GridCluster> clusters = clusterManager.getGridClustersAtLevel(level);

        cluster = clusters[position];

        return(cluster);
    }
Beispiel #13
0
    protected List <GridCluster> clustersOfPoints(List <MapPoint> pointListToCheck)
    {
        List <GridCluster> clustersRelated = new List <GridCluster>();

        foreach (MapPoint p in pointListToCheck)
        {
            GridCluster directCluster = p.getDirectCluster();

            if (!clustersRelated.Contains(directCluster))
            {
                clustersRelated.Add(directCluster);
            }
        }

        return(clustersRelated);
    }
    public int getScale(GridCluster cluster, int totalNumPoints)
    {
        int scaleMin = 5;
        int scaleMax = 40;
        int scale;

        int clusterPoints = cluster.getNumPoints();

        scale = scaleMin + (int)((3 * scaleMax * clusterPoints) / totalNumPoints);

        if (!cluster.isGroupPoints())
        {
            scale = scale / 4;
        }

        return(20); // scale;
    }
        /// <summary>
        /// Read Through Cache
        /// </summary>
        /// <param name="getParams"></param>
        /// <returns></returns>
        private ClusterMarkersResponse GetMarkersHelper(GetMarkersParams getParams)
        {
            try
            {
                var neLat     = getParams.NorthEastLatitude;
                var neLong    = getParams.NorthEastLongitude;
                var swLat     = getParams.SouthWestLatitude;
                var swLong    = getParams.SouthWestLongitude;
                var zoomLevel = getParams.ZoomLevel;
                var filter    = getParams.Filter ?? "";

                // values are validated there
                var markersInput = new MarkersInput(neLat, neLong, swLat, swLong, zoomLevel, filter);

                var grid           = GridCluster.GetBoundaryExtended(markersInput);
                var cacheKeyHelper = string.Format("{0}_{1}_{2}", markersInput.Zoomlevel, markersInput.FilterHashCode(), grid.GetHashCode());
                var cacheKey       = CacheKeys.GetMarkers(cacheKeyHelper.GetHashCode());

                var response = new ClusterMarkersResponse();

                markersInput.Viewport.ValidateLatLon(); // Validate google map viewport input (should be always valid)
                markersInput.Viewport.Normalize();

                // Get all points from memory
                IList <MapPoint> points = _pointCollection.Get(getParams.PointType); // _pointsDatabase.GetPoints();

                // Filter points
                points = FilterUtil.FilterByType(
                    points,
                    new FilterData {
                    TypeFilterExclude = markersInput.TypeFilterExclude
                }
                    );



                // Create new instance for every ajax request with input all points and json data
                var clusterAlgo = new GridCluster(points, markersInput);

                var clusteringEnabled = markersInput.IsClusteringEnabled ||
                                        GmcConfiguration.Get.AlwaysClusteringEnabledWhenZoomLevelLess > markersInput.Zoomlevel;

                // Clustering
                if (clusteringEnabled && markersInput.Zoomlevel < GmcConfiguration.Get.ZoomlevelClusterStop)
                {
                    IList <MapPoint> markers = clusterAlgo.RunCluster();

                    response = new ClusterMarkersResponse
                    {
                        Markers   = markers,
                        Polylines = clusterAlgo.GetPolyLines()
                    };
                }
                else
                {
                    // If we are here then there are no clustering
                    // The number of items returned is restricted to avoid json data overflow
                    IList <MapPoint> filteredDataset          = FilterUtil.FilterDataByViewport(points, markersInput.Viewport);
                    IList <MapPoint> filteredDatasetMaxPoints = filteredDataset.Take(GmcConfiguration.Get.MaxMarkersReturned).ToList();

                    response = new ClusterMarkersResponse
                    {
                        Markers   = filteredDatasetMaxPoints,
                        Polylines = clusterAlgo.GetPolyLines(),
                        Mia       = filteredDataset.Count - filteredDatasetMaxPoints.Count,
                    };
                }

                // if client ne and sw is inside a specific grid box then cache the grid box and the result
                // next time test if ne and sw is inside the grid box and return the cached result
                if (GmcConfiguration.Get.CacheServices)
                {
                    _memCache.Set(cacheKey, response, TimeSpan.FromMinutes(10)); // cache data
                }
                return(response);
            }
            catch (Exception ex)
            {
                return(new ClusterMarkersResponse
                {
                    OperationResult = "0",
                    ErrorMessage = string.Format("MapService says: exception {0}", ex.Message)
                });
            }
        }
 public void addPointGroup(GridCluster gCluster)
 {
     pointGroups.Add(gCluster);
 }
    protected MapPointMarker getClusterMarker(GridCluster gCluster, int id)
    {
        MapPointMarker mapPoint = new MapPointMarker(gCluster.getCenter().getX(), gCluster.getCenter().getY(), clusterPrefab, true);

        mapPoint.setGridCluster(gCluster);
        mapPoint.setLabel("Cluster " + id);

        //if(mapPoint.getMarker3D()!= null)
        //    mapPoint.getMarker3D().instance.name = id.ToString();


        mapPoint.setClusteredPoints(gCluster.getPoints());

        mapPoint.setCluster(true);
        if (mapPoint.getMarker3D() != null)
        {
            mapPoint.getMarker3D().altitude     = 30.0f;
            mapPoint.getMarker3D().altitudeType = OnlineMapsAltitudeType.absolute;
            mapPoint.getMarker3D().scale        = getScale(gCluster, this.points.Count);
        }

        mapPoint.setMap(this);



        addMarkerInstance(mapPoint);


        if (mapPoint.isGroupPoint())
        {
            var img = mapPoint.markerInstance.gameObject.GetComponentInChildren <Image>();
            if (img != null)
            {
                img.sprite = customGroupPointMarker;
                foreach (var imgchild in img.GetComponentsInChildren <Image>())
                {
                    if (imgchild != img)
                    {
                        imgchild.sprite = customGroupPointMarker;
                    }
                }
            }
        }

        gCluster.setCenter(mapPoint);

        //if (gCluster.isGroupPoints())
        //    Debug.Log("AQUI");

        /*
         *
         * if (gCluster.getCategory().Equals("silknow.org/#pthing"))
         * {
         *  SphereCollider sphereCollider = mapPoint.getMarker3D().instance.GetComponent<SphereCollider>();
         *  sphereCollider.radius = 1;
         *  //mapPoint.getMarker3D().scale = mapPoint.getMarker3D().scale * 100.0f;
         * }
         * else
         * {
         *  CapsuleCollider capsuleCollider = mapPoint.getMarker3D().instance.GetComponent<CapsuleCollider>();
         *  capsuleCollider.radius = 0.5f;
         *  capsuleCollider.height = 1.5f;
         *  capsuleCollider.direction = 1;
         *  mapPoint.getMarker3D().altitude = 70.0f;
         *  //mapPoint.getMarker3D().transform.position = mapPoint.getMarker3D().transform.position + new Vector3(0.0f, 60.0f, 0.0f);
         *  //mapPoint.getMarker3D().al
         *
         * }*/



        mapPoint.hide();

        return(mapPoint);
    }
Beispiel #18
0
        /// <summary>
        /// Read Through Cache
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public JsonMarkersReply GetMarkersHelper(JsonGetMarkersInput input)
        {
            try
            {
                var nelat     = Math.Round(input.nelat.ToDouble(), Numbers.Round);
                var nelon     = Math.Round(input.nelon.ToDouble(), Numbers.Round);
                var swlat     = Math.Round(input.swlat.ToDouble(), Numbers.Round);
                var swlon     = Math.Round(input.swlon.ToDouble(), Numbers.Round);
                var zoomLevel = int.Parse(input.zoomLevel);
                var filter    = input.filter ?? "";

                // values are validated there
                var inputValidated = new JsonGetMarkersReceive(nelat, nelon, swlat, swlon, zoomLevel, filter);

                var grid           = GridCluster.GetBoundaryExtended(inputValidated);
                var cacheKeyHelper = string.Format("{0}_{1}_{2}", inputValidated.Zoomlevel, inputValidated.FilterHashCode(), grid.GetHashCode());
                var cacheKey       = CacheKeys.GetMarkers(cacheKeyHelper.GetHashCode());

                var reply = _memCache.Get <JsonMarkersReply>(cacheKey);
                if (reply != null)
                {
                    // return cached data
                    reply.Cache = true;
                    return(reply);
                }

                inputValidated.Viewport.ValidateLatLon();                 // Validate google map viewport input (should be always valid)
                inputValidated.Viewport.Normalize();

                // Get all points from memory
                IList <P> points = _pointsDatabase.GetPoints();

                #region fiter

                // Filter points
                points = FilterUtil.FilterByType(
                    points,
                    new FilterData {
                    TypeFilterExclude = inputValidated.TypeFilterExclude
                }
                    );

                #endregion filter


                // Create new instance for every ajax request with input all points and json data
                ICluster clusterAlgo = new GridCluster(points, inputValidated);

                var clusteringEnabled = inputValidated.IsClusteringEnabled ||
                                        GmcSettings.Get.AlwaysClusteringEnabledWhenZoomLevelLess > inputValidated.Zoomlevel;

                // Clustering
                if (clusteringEnabled && inputValidated.Zoomlevel < GmcSettings.Get.ZoomlevelClusterStop)
                {
                    #region cluster

                    IList <P> markers = clusterAlgo.RunCluster();

                    #endregion cluster

                    reply = new JsonMarkersReply
                    {
                        Markers   = markers,
                        Polylines = clusterAlgo.GetPolyLines(),
                    };
                }
                else
                {
                    // If we are here then there are no clustering
                    // The number of items returned is restricted to avoid json data overflow
                    IList <P> filteredDataset          = FilterUtil.FilterDataByViewport(points, inputValidated.Viewport);
                    IList <P> filteredDatasetMaxPoints = filteredDataset.Take(GmcSettings.Get.MaxMarkersReturned).ToList();

                    reply = new JsonMarkersReply
                    {
                        Markers   = filteredDatasetMaxPoints,
                        Polylines = clusterAlgo.GetPolyLines(),
                        Mia       = filteredDataset.Count - filteredDatasetMaxPoints.Count,
                    };
                }

                // if client ne and sw is inside a specific grid box then cache the grid box and the result
                // next time test if ne and sw is inside the grid box and return the cached result
                if (GmcSettings.Get.CacheServices)
                {
                    _memCache.Set(reply, cacheKey, TimeSpan.FromMinutes(10));                                               // cache data
                }
                return(reply);
            }
            catch (Exception ex)
            {
                return(new JsonMarkersReply
                {
                    Ok = "0",
                    EMsg = string.Format("MapService says: exception {0}", ex.Message)
                });
            }
        }
Beispiel #19
0
 public void addCluster(GridCluster cluster)
 {
     this.clusters.Add(cluster);
     cluster.setLevel(this.getLevel());
 }
Beispiel #20
0
    public void managePoints(List <MapPoint> points, float radius)
    {
        int  numPoints = points.Count;
        bool pointKey  = false;

        radius = radius * radius;

        int baseLevel = -100;

        //Debug.Log("el radio sin raiz es " + radius);

        for (int i = 0; i < numPoints; i++)
        {
            //Debug.Log("Analizando punto " + i + " = " + points[i].getX() + "," + points[i].getY());



            if (!points[i].clusteredLevel)
            {
                GridCluster radialCluster = points[i].isInGroupPoint;

                if (radialCluster == null)
                {
                    radialCluster = new GridCluster(0, 0, points[i], this);
                    //radialCluster.addPoint(points[i]);
                    //points[i].setGridCluster(radialCluster);
                    points[i].addCluster(radialCluster);
                    points[i].clusteredLevel = true;
                }
                else
                {
                    /*
                     * for (int gP = 0; gP < radialCluster.getNumPoints(); gP++)
                     * {
                     *  radialCluster.setLevel(this);
                     *  points[gP].addCluster(radialCluster);
                     *  points[gP].clusteredLevel = true;
                     * }*/
                }

                //Debug.Log("Se crea el cluster con punto "+i);

                for (int j = 0; j < numPoints; j++)
                {
                    //Debug.Log("Analizando emparejamiento con punto " + j + " = " + points[j].getX() + "," + points[j].getY());
                    if (!points[j].clusteredLevel && j != i)
                    {
                        //Debug.Log("Distancia con punto " + j + " es de " + getDistance(points[i], points[j]));
                        if (getDistance(points[i], points[j]) <= radius)
                        {
                            radialCluster.addPoint(points[j]);
                            points[j].addCluster(radialCluster);
                            points[j].clusteredLevel = true;
                        }
                    }
                }

                if (pointKey)
                {
                    Debug.Log("El cluster radial tiene " + radialCluster.getNumPoints());
                    pointKey = false;
                }

                if (radialCluster.getNumPoints() > 0)
                {
                    radialCluster.update();
                    this.addCluster(radialCluster);
                }
                else
                {
                    // points[i].removeCluster(radialCluster);
                    //points[i].clusteredLevel = false;

                    //for (int auxC=0;auxC<auxList.Count;auxC++)
                    //{
                    //  auxList[auxC].removeCluster(radialCluster);
                    //    auxList[auxC].clusteredLevel = false;
                    //  }
                }
                //auxList.Clear();
            }
        }


        //Debug.Log("En el nivel base hay " + this.clusters.Count + " clusters mayores de 1 punto");

        int punto1 = 0;

        for (int i = 0; i < numPoints; i++)
        {
            if (!points[i].clusteredLevel)
            {
                GridCluster radialCluster = new GridCluster(0, 0, points[i], this);
                //radialCluster.addPoint(points[i]);
                //points[i].setGridCluster(radialCluster);
                points[i].clusteredLevel = true;
                points[i].addCluster(radialCluster);
                this.addCluster(radialCluster);
                punto1++;
            }
        }

        //Debug.Log("En el nivel base hay " + punto1 + " clusters de 1 punto");
    }
Beispiel #21
0
 public void setGridCluster(GridCluster gCluster)
 {
     this.gridCluster = gCluster;
     setCluster(true);
 }
Beispiel #22
0
 public void removeCluster(GridCluster cluster)
 {
     this.clusterList.Remove(cluster);
 }
Beispiel #23
0
    public void managePointsNew(GridCluster cluster)
    {
        int             i      = 0;
        List <MapPoint> points = cluster.getPoints();

        //Debug.Log("Managin cluster with " + points.Count);

        int numPoints = points.Count;

        List <GridCluster> newClusters = new List <GridCluster>();
        float   width  = (cluster.maxX - cluster.minX) / 2.5f;
        float   heigth = cluster.maxY - cluster.minY;
        Vector2 size   = new Vector2(width, heigth);

        if (size.x != 0.0f)
        {
            Rect area1 = new Rect(new Vector2(cluster.minX, cluster.minY), size);
            //Rect area2 = new Rect(new Vector2(cluster.minX + (cluster.maxX - cluster.minX) / 3.0f, cluster.minY), size);
            Rect area3 = new Rect(new Vector2(cluster.maxX - (cluster.maxX - cluster.minX) / 3.0f, cluster.minY), size);

            Vector2 center1 = getRectCenter(area1);
            //Vector2 center2 = getRectCenter(area2);
            Vector2 center3 = getRectCenter(area3);

            GridCluster cluster1 = new GridCluster(0, 0); // this.getHGrid(center1.x), this.getVGrid(center1.y));
                                                          // GridCluster cluster2 = new GridCluster(0,0); //;this.getHGrid(center2.x), this.getVGrid(center2.y));
            GridCluster cluster3 = new GridCluster(0, 0); // this.getHGrid(center3.x), this.getVGrid(center3.y));

            for (i = 0; i < numPoints; i++)
            {
                MapPoint p = cluster.getPoints()[i];

                if (isInRect(p.getX(), p.getY(), area1))
                {
                    p.addCluster(cluster1);
                    cluster1.addPoint(p);
                }
                else
                {
                    /*
                     * if (isInRect(p.getX(), p.getY(), area2))
                     * {
                     *  p.addCluster(cluster2);
                     *  cluster2.addPoint(p);
                     * }
                     * else
                     * {*/
                    p.addCluster(cluster3);
                    cluster3.addPoint(p);
                    //}
                }
            }

            int numclusters = 0;

            if (cluster1.getNumPoints() > 0)
            {
                cluster1.setParent(cluster);
                cluster1.setLevel(this.level);
                cluster.addChild(cluster1);
                this.clusters.Add(cluster1);
                numclusters++;
            }

            /*
             * if (cluster2.getNumPoints() > 0)
             * {
             *  cluster2.setParent(cluster);
             *  cluster.addChild(cluster2);
             *  cluster2.setLevel(this.level);
             *  this.clusters.Add(cluster2);
             *  numclusters++;
             * }*/

            if (cluster3.getNumPoints() > 0)
            {
                cluster3.setParent(cluster);
                cluster.addChild(cluster3);
                cluster3.setLevel(this.level);
                this.clusters.Add(cluster3);
                numclusters++;
            }
            //Debug.Log("Se crean "+ numclusters+ " clusters normales en nivel " + this.level);
        }
        else // grouppoint o clusters de 1 punto
        {
            //Debug.Log("Se crea un cluster de grouppoint/1 punto en nivel " + this.level);
            GridCluster cluster1 = new GridCluster(0, 0, cluster.getPoints()[0]);
            cluster1.setLevel(this.level);
            cluster1.setParent(cluster);
            cluster.addChild(cluster1);
            this.clusters.Add(cluster1);
        }
    }
 public void setParent(GridCluster cluster)
 {
     this.parent = cluster;
 }
    public void update()
    {
        int      i         = 0;
        MapLevel lastLevel = null;


        //List<MapPoint> levelPoints = this.points;

        //Debug.Log("Actualizando para " + points.Count + "");


        for (i = 0; i < zoomIntervals; i++)
        {
            this.levels.Add(new MapLevel(this.zone, this.numQuadsHoriz, this.numQuadsVert, i));
        }


        for (i = zoomIntervals - 2; i >= 0; i--)
        {
            int numClos = 0;

            int punto1 = 0;
            //MapLevel level = new MapLevel(this.zone, this.numQuadsHoriz, this.numQuadsVert, i);
            MapLevel level = this.levels[i];


            if (lastLevel == null)
            {
                //Debug.Log("Hay "+ this.pointGroups.Count+" gouppoints");


                for (int pG = 0; pG < this.pointGroups.Count; pG++)
                {
                    this.pointGroups[pG].setLevel(level);
                    level.addCluster(this.pointGroups[pG]);
                    //this.pointGroups[pG].processed = true;
                }
                level.managePoints(this.points, 0.5f);
            }
            else
            {
                List <GridCluster> clusterList = lastLevel.getGridClusters();// this.getGridClustersAtLevel(i+1);
                //Debug.Log("EN ZOOM INTERVAL " + i + "y nivel " + lastLevel.getLevel() + " hay ....");
                //Debug.Log("EN nivel " + lastLevel.getLevel() + " hay " + clusterList.Count + " clusters");

                //Debug.Log("El minimio del nivel " + lastLevel.getLevel() + " es " + level.getMinimum());
                if (clusterList != null)
                {
                    if (clusterList.Count == 1)
                    {
                        //Debug.Log("UNO Y SALE");
                        GridCluster newGridCluster = new GridCluster(clusterList[0]);
                        newGridCluster.associatePoints();
                        //newGridCluster.update();
                        level.addCluster(newGridCluster);
                    }
                    else
                    {
                        float minimum = level.getMinimum();

                        if (level.getLevel() <= 1)
                        {
                            minimum = minimum * 100.0f;
                        }

                        //for (int o = 0;o<clusterList.Count;o++)
                        //  clusterList[o].closest = getClosestTo(clusterList[o], clusterList, 0, minimum, false);

                        int aux = 0;
                        while (aux < clusterList.Count)
                        {
                            GridCluster currentCluster = clusterList[aux];
                            if (!clusterList[aux].processed)
                            {
                                if (clusterList[aux].getPoints()[0].getURI().Equals(("http://data.silknow.org/object/5f7a48fe-d8ac-37d8-90e3-f4448e665a9b")))
                                {
                                    Debug.Log("Procesando");
                                }
                                GridCluster closest = getClosestTo(clusterList[aux], clusterList, aux, minimum, false);

                                if (closest != null)
                                {
                                    GridCluster newGridCluster = new GridCluster(currentCluster, closest);
                                    newGridCluster.associatePoints();
                                    newGridCluster.update();
                                    level.addCluster(newGridCluster);
                                    currentCluster.processed = true;
                                    closest.processed        = true;
                                    numClos++;
                                }
                                else
                                {
                                    GridCluster newGridCluster = new GridCluster(currentCluster);
                                    newGridCluster.associatePoints();
                                    //newGridCluster.update();
                                    level.addCluster(newGridCluster);
                                    currentCluster.processed = true;
                                    punto1++;
                                }

                                /*
                                 * }
                                 * else
                                 * {
                                 *  GridCluster newGridCluster = new GridCluster(currentCluster);
                                 *  newGridCluster.associatePoints();
                                 *  //newGridCluster.update();
                                 *  level.addCluster(newGridCluster);
                                 *  currentCluster.processed = true;
                                 *  punto1++;
                                 *  //closest.processed = true;
                                 * }*/
                            }
                            aux++;
                        }
                    }
                }
                //Debug.Log("EN el nivel " + i + " hay " + level.getGridClusters().Count);
                //Debug.Log("De los cuales " + punto1 + " son de 1 punto");
            }

            //Debug.Log(numClos + " clusters cercanos");
            lastLevel = level;

            //this.levels.Add(level);
        }

        for (int p = 0; p < points.Count; p++)
        {
            if (points[p].getURI().Equals("http://data.silknow.org/object/54e7582f-d37e-3e85-9cac-c26b52a7711b"))
            {
                MapPoint pn = points[p];
            }

            if (points[p].getURI().Equals("http://data.silknow.org/object/12eed6aa-578c-39c0-b0d8-ecf3cdfd68c8"))
            {
                MapPoint pn = points[p];
            }

            if (points[p].getURI().Equals("http://data.silknow.org/object/db5ed89d-fac0-3cf1-81ec-fc55a66b8252"))
            {
                MapPoint pn = points[p];
            }
        }
    }
 public void associateTo(GridCluster gridCluster)
 {
     this.associatedTo = gridCluster;
 }
        // Post
        public JsonMarkersReply Markers(
            double nelat, double nelon, double swlat, double swlon,
            int zoomlevel, string filter, int sendid
            )
        {
            var sw = new Stopwatch();

            sw.Start();

            var jsonReceive = new JsonGetMarkersReceive(nelat, nelon, swlat, swlon, zoomlevel, filter, sendid);

            var clusteringEnabled = jsonReceive.IsClusteringEnabled || AlgoConfig.AlwaysClusteringEnabledWhenZoomLevelLess > jsonReceive.Zoomlevel;

            JsonMarkersReply reply;

            jsonReceive.Viewport.ValidateLatLon(); // Validate google map viewport input (is always valid)
            jsonReceive.Viewport.Normalize();

            // Get all points from memory
            IPoints points = MemoryDatabase.GetPoints();

            if (jsonReceive.TypeFilterExclude.Count == AlgoConfig.MarkerTypes.Count)
            {
                // Filter all
                points = new Points(); // empty
            }
            else if (jsonReceive.TypeFilterExclude.Count > 0)
            {
                // Filter data by typeFilter value
                // Make new obj, don't overwrite obj data
                points = new Points
                {
                    Data = points.Data
                           .Where(p => jsonReceive.TypeFilterExclude.Contains(p.T) == false)
                           .ToList()
                };
            }

            // Create new instance for every ajax request with input all points and json data
            var clusterAlgo = new GridCluster(points, jsonReceive); // create polylines

            // Clustering
            if (clusteringEnabled && jsonReceive.Zoomlevel < AlgoConfig.ZoomlevelClusterStop)
            {
                // Calculate data to be displayed
                var clusterPoints = clusterAlgo.GetCluster(new ClusterInfo
                {
                    ZoomLevel = jsonReceive.Zoomlevel,
                });

                var converted = DataConvert(clusterPoints);

                // Prepare data to the client
                reply = new JsonMarkersReply
                {
                    Markers   = converted,
                    Rid       = sendid,
                    Polylines = clusterAlgo.Lines,
                    Msec      = Sw(sw),
                };

                // Return client data
                return(reply);
            }

            // If we are here then there are no clustering
            // The number of items returned is restricted to avoid json data overflow
            IPoints filteredDataset          = ClusterAlgorithmBase.FilterDataset(points, jsonReceive.Viewport);
            IPoints filteredDatasetMaxPoints = new Points
            {
                Data = filteredDataset.Data
                       .Take(AlgoConfig.MaxMarkersReturned)
                       .ToList()
            };

            reply = new JsonMarkersReply
            {
                Markers   = DataConvert(filteredDatasetMaxPoints),
                Rid       = sendid,
                Polylines = clusterAlgo.Lines,
                Mia       = filteredDataset.Count - filteredDatasetMaxPoints.Count,
                Msec      = Sw(sw),
            };
            return(reply);
        }
    protected GridCluster getClosestTo(GridCluster from, List <GridCluster> clusterList, int since, float minimum, bool check)
    {
        GridCluster closest  = null;
        GridCluster closest1 = null;
        string      fromURI  = from.getPoints()[0].getURI();

        float minDistance  = 1000000.0f;
        float minDistance1 = 1000000.0f;
        //float minimum = 5.0f;

        int i = since;

        //i = 0;

        while (i < clusterList.Count)
        {
            if (!clusterList[i].processed && from != clusterList[i])  //&& clusterList[i].getNumPoints()>1)
            {
                float currentDistance = getDistance(from.getCenter(), clusterList[i].getCenter());

                if (currentDistance <= minimum)
                {
                    if (check)
                    {
                        //GridCluster closest2 = getClosestTo(clusterList[i], clusterList, since, minimum, false);

                        GridCluster closest2 = clusterList[i].closest;

                        if (closest2 != null)
                        {
                            if (closest2.getPoints()[0].getURI().Equals(fromURI))
                            {
                                if (currentDistance < minDistance && clusterList[i].getNumPoints() >= 1)
                                {
                                    minDistance = currentDistance;
                                    closest     = clusterList[i];
                                }

                                /*
                                 * if (currentDistance < minDistance1 && clusterList[i].getNumPoints() == 1)
                                 * {
                                 *  minDistance1 = currentDistance;
                                 *  closest1 = clusterList[i];
                                 * }*/
                            }
                        }
                    }
                    else
                    {
                        if (currentDistance < minDistance && clusterList[i].getNumPoints() >= 1)
                        {
                            minDistance = currentDistance;
                            closest     = clusterList[i];
                        }

                        /*
                         * if (currentDistance < minDistance1 && clusterList[i].getNumPoints() == 1)
                         * {
                         *  minDistance1 = currentDistance;
                         *  closest1 = clusterList[i];
                         * }*/
                    }
                }
            }

            i++;
        }

        //if (minDistance1 < minDistance / 1.25f)
        //  closest = closest1;

        return(closest);
    }