Ejemplo n.º 1
0
        static void ConvertDataset()
        {
            var list    = FileUtil.ReadFile(@"c:\temp\temp.csv");
            var dataset = new Points();

            foreach (var s in list)
            {
                var arr = s.Split(';');
                if (arr.Length != 4)
                {
                    continue;
                }


                double x = arr[0].ToDouble();
                double y = arr[1].ToDouble();
                var    i = arr[2].ToInt();
                var    t = arr[3].ToInt();

                dataset.Add(new P {
                    X = x, Y = y, I = i, T = t
                });
            }

            FileUtil.SaveDataSetToFile(dataset, "temp.ser");
        }
        private static IPoints LoadDatasetFromCsv(string websitepath)
        {
            var filepath = websitepath;
            var fi = new FileInfo(websitepath);
            if (!fi.Exists)
            {
                throw new ApplicationException("File does not exists: " + fi.FullName);
            }

            var list = FileUtil.ReadFile(filepath);
            IPoints dataset = new Points();

            foreach (var s in list)
            {
                var arr = s.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
                if (arr.Length != 4) continue;

                var x = arr[0].ToDouble();
                var y = arr[1].ToDouble();
                var i = arr[2].ToInt();
                var t = arr[3].ToInt();

                dataset.Add(new P { X = x, Y = y, I = i, T = t });
            }
            
            dataset.Normalize();
            return dataset;
        }
 public Bucket(string id)
 {
     IsUsed = true;
     Centroid = null;
     Points = new Points();
     Id = id;
 }
 public Bucket(int idx, int idy, string id)
 {
     IsUsed = true;
     Centroid = null;
     Points = new Points();
     Idx = idx;
     Idy = idy;
     Id = id;
 }
Ejemplo n.º 5
0
        // lat lon points data
        static void LatLonParse()
        {
            //http://download.geonames.org/export/dump/

            var          rand      = new Random();
            const string name      = "cities1000";
            var          lines     = FileUtil.ReadFile(string.Format("c:\\temp\\{0}.txt", name));
            var          dataset   = new Points();
            const int    numOfType = 3;

            foreach (var line in lines)
            {
                var delimiters = new[] { ' ', '\t' };
                var arr        = line.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
                if (arr.Length < 10)
                {
                    continue;
                }

                double?lon = null;
                double?lat = null;
                var    id  = arr[0].ToInt();

                for (var i = 1; i < arr.Length - 2; i++)
                {
                    double d1, d2, d3;
                    var    dp1 = Double.TryParse(arr[i], NumberStyles.Float, NumberFormatInfo.InvariantInfo, out d1);
                    var    dp2 = Double.TryParse(arr[i + 1], NumberStyles.Float, NumberFormatInfo.InvariantInfo, out d2);
                    var    dp3 = Double.TryParse(arr[i + 2], NumberStyles.Float, NumberFormatInfo.InvariantInfo, out d3);

                    if (dp1 && dp2 && dp3)
                    {
                        lat = d2;
                        lon = d3;
                        break;
                    }
                    if (dp1 && dp2)
                    {
                        lat = d1;
                        lon = d2;
                        break;
                    }
                }

                if (lon.HasValue && lat.HasValue && MathTool.IsLonValid(lon.Value) && MathTool.IsLatValid(lat.Value))
                {
                    dataset.Add(new P {
                        X = lon.Value, Y = lat.Value, I = id, T = (rand.Next(numOfType) + 1)
                    });
                }
            }

            SaveCsvData(dataset, new FileInfo(string.Format("c:\\temp\\{0}.csv", name)));
        }
        static void ConvertDataset()
        {
            var list = FileUtil.ReadFile(@"c:\temp\temp.csv");
            var dataset = new Points();

            foreach (var s in list)
            {
                var arr = s.Split(';');
                if (arr.Length != 4) continue;

                double x = arr[0].ToDouble();
                double y = arr[1].ToDouble();
                var i = arr[2].ToInt();
                var t = arr[3].ToInt();

                dataset.Add(new P { X = x, Y = y, I = i, T = t });
            }

            FileUtil.SaveDataSetToFile(dataset, "temp.ser");
        }
 public DatasetToSerialize()
 {
     Dataset = new Points();
 }
        public IPoints GetClusterResult(Boundary grid)
        {
            // Collect used buckets and return the result
            var clusterPoints = new Points();

            //O(m*n)
            foreach (var item in BucketsLookup)
            {
                var bucket = item.Value;
                if (!bucket.IsUsed) continue;

                if (bucket.Points.Count < AlgoConfig.MinClusterSize) clusterPoints.Data.AddRange(bucket.Points.Data);
                else
                {
                    bucket.Centroid.C = bucket.Points.Count;
                    clusterPoints.Add(bucket.Centroid);
                }
            }

            //var filtered = FilterDataset(clusterPoints, grid); // post filter data for client viewport
            //return filtered; //not working properly when zoomed far out.
            return clusterPoints;  // return not post filtered
        }
        // lat lon points data
        static void LatLonParse()
        {
            //http://download.geonames.org/export/dump/

            var rand = new Random();
            const string name = "cities1000";
            var lines = FileUtil.ReadFile(string.Format("c:\\temp\\{0}.txt", name));
            var dataset = new Points();
            const int numOfType = 3;

            foreach (var line in lines)
            {
                var delimiters = new[] { ' ', '\t' };
                var arr = line.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
                if (arr.Length < 10) continue;

                double? lon = null;
                double? lat = null;
                var id = arr[0].ToInt();

                for (var i = 1; i < arr.Length - 2; i++)
                {
                    double d1, d2, d3;
                    var dp1 = Double.TryParse(arr[i], NumberStyles.Float, NumberFormatInfo.InvariantInfo, out d1);
                    var dp2 = Double.TryParse(arr[i + 1], NumberStyles.Float, NumberFormatInfo.InvariantInfo, out d2);
                    var dp3 = Double.TryParse(arr[i + 2], NumberStyles.Float, NumberFormatInfo.InvariantInfo, out d3);

                    if (dp1 && dp2 && dp3)
                    {
                        lat = d2;
                        lon = d3;
                        break;
                    }
                    if (dp1 && dp2)
                    {
                        lat = d1;
                        lon = d2;
                        break;
                    }
                }

                if (lon.HasValue && lat.HasValue && MathTool.IsLonValid(lon.Value) && MathTool.IsLatValid(lat.Value))
                {
                    dataset.Add(new P { X = lon.Value, Y = lat.Value, I = id, T = (rand.Next(numOfType) + 1) });
                }
            }

            SaveCsvData(dataset, new FileInfo(string.Format("c:\\temp\\{0}.csv", name)));
        }
 static MemoryDatabase()
 {
     Points = new Points();
     PointsBackup = new Points();
 }
        // 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;
        }
 static MemoryDatabase()
 {
     Points       = new Points();
     PointsBackup = new Points();
 }
        // 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);
        }