예제 #1
0
        public GeoJson ConvertToGeoJson(bool convertLineStringCoordsToPolygon, int maxVerticesToApproximateTo)
        {
            if (LineworkBoundaries == null)
            {
                return(null);
            }

            var geoJson = new GeoJson
            {
                Type     = GeoJson.FeatureType.FEATURE_COLLECTION,
                Features = new List <Feature>()
            };

            foreach (var boundary in LineworkBoundaries)
            {
                var fencePoints = DouglasPeucker.DouglasPeuckerByCount(
                    boundary.Boundary.Select(p => new WGSPoint(latitude: p.Lat, longtitude: p.Lon)).ToArray(),
                    maxVerticesToApproximateTo);

                geoJson.Features.Add(new Feature
                {
                    Type       = GeoJson.FeatureType.FEATURE,
                    Properties = new Properties {
                        Name = boundary.BoundaryName
                    },
                    Geometry = GetCoordinatesFromFencePoints(fencePoints, convertLineStringCoordsToPolygon)
                });
            }

            return(geoJson);
        }
예제 #2
0
        public IHttpActionResult GetPathElevation(Location[] path, int samples = 100)
        {
            try
            {
                var geoPoints = ModelFactory.Create(path);
                var geom      = GeometryService.ParseGeoPointAsGeometryLine(geoPoints);
                _elevationService.DownloadMissingFiles(DEMDataSet.AW3D30, geom.GetBoundingBox());
                geoPoints = _elevationService.GetLineGeometryElevation(geom, DEMDataSet.AW3D30, InterpolationMode.Bilinear);
                ElevationMetrics metrics = GeometryService.ComputeMetrics(geoPoints);

                if (samples > 2)
                {
                    double ratio     = 4 / 2;
                    double tolerance = (metrics.MaxElevation - metrics.MinElevation) / (samples / ratio);
                    geoPoints = DouglasPeucker.DouglasPeuckerReduction(geoPoints, tolerance);
                }


                // Model
                ElevationMetricsModel metricsModel = ModelFactory.CreateElevationMetricsModel(geoPoints, metrics);
                var feature = ModelFactory.CreateFeature(geoPoints, metricsModel);
                return(Ok(feature));
            }
            catch (Exception ex)
            {
                return(InternalServerError(new Exception(ex.Message)));
            }
        }
예제 #3
0
    public void Simplify(float epsilon)
    {
        Debug.Log("Start simplify with epsilon = " + epsilon + ", number of points before: " + line.positionCount);
        var newList = DouglasPeucker.DouglasPeuckerReduction(GetPositions(), epsilon);

        SetPositions(newList);
        Debug.Log("End simplify with epsilon = " + epsilon + ", number of points after: " + line.positionCount);
    }
        private void douglasPeuckerbox_Click(object sender, RoutedEventArgs e)
        {
            MapCanvas.Children.Clear();
            var dp = new DouglasPeucker();

            for (var index = 0; index < Points.Count; index++)
            {
                Points[index] = dp.DouglasPeuckerReduction(Points[index], 25);

                DrawMap(Points[index]);
            }
        }
예제 #5
0
        private void btnSmartFilter_Click(object sender, RoutedEventArgs e)
        {
            DouglasPeucker  dp = new DouglasPeucker();
            var             d  = poly.Points.ToList();
            var             t  = dp.DouglasPeuckerReduction(d, 10);
            PointCollection pc = new PointCollection();

            foreach (var point in t)
            {
                pc.Add(point);
            }
            poly.Points = pc;
        }
예제 #6
0
        public IActionResult PolylineReducePoints([FromBody] SmoothPolylineRequest requestDto)
        {
            Log.LogDebug($"{nameof(PolylineReducePoints)}: {requestDto}");

            if (requestDto.MaxPoints > SmoothPolylineRequest.NOT_DEFINED && requestDto.MaxPoints < 3)
            {
                return(StatusCode((int)HttpStatusCode.BadRequest, new { Message = "Cannot reduce polyline to fewer than 3 points." }));
            }

            var fencePoints = DouglasPeucker.DouglasPeuckerByCount(requestDto.Coordinates, requestDto.MaxPoints);

            return(StatusCode((int)HttpStatusCode.OK, new { coordinates = fencePoints }));
        }
        private void douglasPeucker_Click(object sender, RoutedEventArgs e)
        {
            MapCanvas.Children.Clear();
            var dp = new DouglasPeucker();

            for (var index = 0; index < Points.Count; index++)
            {
                var pointlist = Points[index];
                Points[index] = dp.DouglasPeuckerReduction(pointlist, 5);

                DrawMap(pointlist);
            }
        }
예제 #8
0
        public static CollisionDefinition FromTexture(Texture2D texture, float tolerance, Transform transform)
        {
            List <CollisionDefinitionEntry> collisions = new List <CollisionDefinitionEntry>();

            //Get the pixellated outline
            TextureToPerimeter texP = new TextureToPerimeter();

            foreach (var perimeter in texP.March(texture))
            {
                //Remove redundant aligned points
                var     simplifiedLine = new List <Vector2>();
                Vector2 lastDir        = Vector2.Zero;
                for (int i = 1; i < perimeter.Count; i++)
                {
                    Vector2 dir = perimeter[i] - perimeter[i - 1];
                    if (lastDir != dir)
                    {
                        simplifiedLine.Add(perimeter[i - 1]);
                    }

                    lastDir = dir;
                }

                //Use dougles peucker to further simplify the outline, and fix local coordinates
                simplifiedLine = DouglasPeucker.DouglasPeuckerReduction(simplifiedLine, tolerance);
                for (int i = 0; i < simplifiedLine.Count; i++)
                {
                    simplifiedLine[i] -= new Vector2(texture.Width, texture.Height) * 0.5f;
                    simplifiedLine[i]  = new Vector2(simplifiedLine[i].X, -simplifiedLine[i].Y);

                    simplifiedLine[i]  = simplifiedLine[i].Rotate(transform.Orientation);
                    simplifiedLine[i] += transform.Position;
                }

                //Triangulate the resulting outline
                Triangulator tr      = new Triangulator(simplifiedLine.ToArray());
                var          indices = tr.Triangulate();

                collisions.Add(new CollisionDefinitionEntry()
                {
                    Indices = indices, Vertices = simplifiedLine.ToArray()
                });
            }

            return(new CollisionDefinition()
            {
                Entries = collisions.ToArray()
            });
        }
예제 #9
0
파일: Homotopy.cs 프로젝트: mosuem/ariadne
    List <Vector3> getPoints(MPath path2)
    {
        var           points   = new List <Vector3> ();
        List <Vertex> vertices = new List <Vertex> ();

        for (int i = 0; i < path2.Count; i++)
        {
            var point = path2.GetPosition(i);
            points.Add(point);
        }
        for (int i = path1.Count - 2; i > 0; i--)
        {
            var point = path1.GetPosition(i);
            points.Add(point);
        }
        points = DouglasPeucker.DouglasPeuckerReduction(points, 0.01d);
        return(points);
    }
예제 #10
0
        void BuildReducedSeries(LineSeries lineSeries, List <DouglasPeucker.Point> fullList, double tolerance)
        {
            if (Config.Result.PlotSmoothingEnabled)
            {
                // reduce the samples (keep only significant) -> smoothing in plot is much better
                IList <DouglasPeucker.Point> reducedList = DouglasPeucker.Reduce(fullList, tolerance);

                foreach (DouglasPeucker.Point p in reducedList)
                {
                    lineSeries.Points.Add(new DataPoint(p.X, p.Y));
                }
            }
            else
            {
                // no smoothing in plot -> copy all samples
                foreach (DouglasPeucker.Point p in fullList)
                {
                    lineSeries.Points.Add(new DataPoint(p.X, p.Y));
                }
            }
        }
예제 #11
0
        static void LineDEMTest(ElevationService elevationService, DEMDataSet dataSet, string wkt, int numSamples)
        {
            Stopwatch sw = Stopwatch.StartNew();

            elevationService.DownloadMissingFiles(dataSet, GetBoundingBox(wkt));

            var lineElevationData         = elevationService.GetLineGeometryElevation(wkt, dataSet, InterpolationMode.Bilinear);
            ElevationMetrics metrics      = GeometryService.ComputeMetrics(ref lineElevationData);
            var lineElevationData_Reduced = DouglasPeucker.DouglasPeuckerReduction(lineElevationData, (metrics.MaxElevation - metrics.MinElevation) / numSamples);

            sw.Stop();
            Console.WriteLine($"LineDEMTest performed in {sw.Elapsed:g}.");

            SpatialTrace.Enable();
            SpatialTrace.Clear();
            SpatialTraceLine(lineElevationData, $"Full resolution line ({lineElevationData.Count} points)");


            SpatialTraceLine(lineElevationData_Reduced, $"Reduced line ({lineElevationData_Reduced.Count} points)");

            SpatialTrace.ShowDialog();
        }
예제 #12
0
    public void OnProcessDrawing()
    {
        foreach (LineRenderer line in m_lineList)
        {
            LineRenderer item = Instantiate(line);
            m_duplicatedLineList.Add(item);
        }
        float num  = float.MaxValue;
        float num2 = float.MaxValue;
        float num3 = float.MinValue;
        float num4 = float.MinValue;

        foreach (LineRenderer duplicatedLine in m_duplicatedLineList)
        {
            Vector3[] array = new Vector3[duplicatedLine.positionCount];
            duplicatedLine.GetPositions(array);
            for (int i = 0; i < array.Length; i++)
            {
                Vector3 vector = array[i];
                if (vector.x < num)
                {
                    num = vector.x;
                }
                if (vector.y < num2)
                {
                    num2 = vector.y;
                }
                if (vector.x > num3)
                {
                    num3 = vector.x;
                }
                if (vector.y > num4)
                {
                    num4 = vector.y;
                }
            }
        }
        int num5 = 2;

        if (m_duplicatedLineList.Count > 15)
        {
            num5 = 6;
        }
        else if (m_duplicatedLineList.Count > 10)
        {
            num5 = 5;
        }
        else if (m_duplicatedLineList.Count > 5)
        {
            num5 = 4;
        }
        float         a    = 255f / (num3 - num);
        float         b    = 255f / (num4 - num2);
        float         num6 = Mathf.Min(a, b);
        List <double> list = new List <double>();
        int           num7 = 0;
        int           num8 = 0;

        foreach (LineRenderer duplicatedLine2 in m_duplicatedLineList)
        {
            Vector3[] array2 = new Vector3[duplicatedLine2.positionCount];
            duplicatedLine2.GetPositions(array2);
            for (int j = 0; j < array2.Length; j++)
            {
                Vector3 vector2 = array2[j];
                vector2.x -= num;
                vector2.x *= num6;
                vector2.x  = Mathf.Floor(vector2.x);
                vector2.y -= num2;
                vector2.y *= num6;
                vector2.y  = Mathf.Floor(vector2.y);
                int num9 = 127 - (int)vector2.y;
                vector2.y += 2 * num9;
                array2[j]  = vector2;
            }
            List <Vector2> list2 = new List <Vector2>();
            for (int k = 0; k < array2.Length; k++)
            {
                list2.Add(array2[k]);
            }
            IList <Vector2> list3 = DouglasPeucker.DouglasPeuckerReduction(list2, num5);
            List <Vector3>  list4 = new List <Vector3>();
            foreach (Vector2 item2 in list3)
            {
                Vector2 current4 = item2;
                list4.Add(new Vector3(current4.x, current4.y, 0f));
                list.Add((double)current4.x / 255.0);
                list.Add((double)current4.y / 255.0);
                list.Add(0.0);
                num7 += 3;
                num8++;
            }
            list[num7 - 1] = 1.0;
            duplicatedLine2.positionCount = list4.Count;
            duplicatedLine2.SetPositions(list4.ToArray());
        }
        for (int l = 0; l < num8 - 1; l++)
        {
            list[l * 3]     = list[(l + 1) * 3] - list[l * 3];
            list[l * 3 + 1] = list[(l + 1) * 3 + 1] - list[l * 3 + 1];
            list[l * 3 + 2] = list[(l + 1) * 3 + 2];
        }
        double[] inferData = list.ToArray();
        string   str       = "[";
        bool     flag      = false;

        foreach (LineRenderer duplicatedLine3 in m_duplicatedLineList)
        {
            ImageDataStroke imageDataStroke = new ImageDataStroke();
            Vector3[]       array3          = new Vector3[duplicatedLine3.positionCount];
            duplicatedLine3.GetPositions(array3);
            if (flag)
            {
                str += ",";
            }
            flag = true;
            str += "[";
            for (int m = 0; m < array3.Length; m++)
            {
                Vector3 vector3 = array3[m];
                imageDataStroke.x.Add((int)vector3.x);
                imageDataStroke.y.Add((int)vector3.y);
            }
            string input = JsonUtility.ToJson(imageDataStroke);
            string str2  = Regex.Replace(input, "[{}a-zA-Z:?\"]", string.Empty);
            str += str2;
            str += "]";
        }
        str = (m_opuput = str + "]");
        Debug.Log(str);
        //TensorModel.Infer(inferData, 5);

        /* string sttr = "";
         * foreach(double d in inferData)
         * {
         *   sttr += d.ToString() +"|";
         * }
         * Debug.Log(sttr);*/


        foreach (LineRenderer duplicatedLine4 in m_duplicatedLineList)
        {
            Destroy(duplicatedLine4.gameObject);
        }
        m_duplicatedLineList.Clear();
    }
예제 #13
0
        /// <summary>
        /// Exports the geographic data in packed string format with reduced quality.
        /// </summary>
        public string GetCountryGeoDataLowQuality()
        {
            // step 1: duplicate data
            IAdminEntity[] entities;
            if (editingMode == EDITING_MODE.COUNTRIES)
            {
                entities = map.countries;
            }
            else
            {
                entities = map.provinces;
            }
            List <IAdminEntity> entities1 = new List <IAdminEntity>(entities);

            // step 1: prepare data structures
            for (int k = 0; k < entities1.Count; k++)
            {
                entities1[k].regions = new List <Region>(entities1[k].regions);
            }

            // step 2: catalog points
            int totalPoints = 0;
            List <PolygonPoint> allPoints = new List <PolygonPoint>(150000);

            for (int k = 0; k < entities1.Count; k++)
            {
                for (int r = 0; r < entities1[k].regions.Count; r++)
                {
                    Region region1 = entities1[k].regions[r];
                    totalPoints += region1.latlon.Length;
                    allPoints.AddRange(region1.latlon);
                }
            }

            allPoints = DouglasPeucker.SimplifyCurve(allPoints, 0.1);
            Dictionary <PolygonPoint, bool> allPointsLookup = new Dictionary <PolygonPoint, bool>(allPoints.Count);

            for (int k = 0; k < allPoints.Count; k++)
            {
                if (!allPointsLookup.ContainsKey(allPoints[k]))
                {
                    allPointsLookup.Add(allPoints[k], true);
                }
            }

            // step 3: reduce region points according to exclusion catalog
            int savings = 0;
            List <PolygonPoint> goodLatLons = new List <PolygonPoint>(15000);

            for (int k = 0; k < entities1.Count; k++)
            {
                for (int r = 0; r < entities1[k].regions.Count; r++)
                {
                    goodLatLons.Clear();
                    Region region = entities1[k].regions[r];
                    for (int p = 0; p < region.latlon.Length; p++)
                    {
                        PolygonPoint latlon = region.latlon[p];
                        if (allPointsLookup.ContainsKey(latlon))
                        {
                            goodLatLons.Add(latlon);
                        }
                    }
                    goodLatLons = PolygonSanitizer.RemoveCrossingSegments(goodLatLons);
                    if (goodLatLons.Count < 5)
                    {
                        entities1[k].regions.Remove(region);
                        r--;
                    }
                    else
                    {
                        totalPoints  += region.latlon.Length;
                        savings      += (region.latlon.Length - goodLatLons.Count);
                        region.latlon = goodLatLons.ToArray();
                    }
                }
            }
            Debug.Log(savings + " points removed of " + totalPoints + " (" + (((float)savings / totalPoints) * 100.0f).ToString("F1") + "%)");

            StringBuilder sb = new StringBuilder();

            for (int k = 0; k < entities1.Count; k++)
            {
                IAdminEntity entity = entities1[k];
                if (entity.regions.Count == 0)
                {
                    continue;
                }
                if (k > 0)
                {
                    sb.Append("|");
                }
                sb.Append(entity.name + "$");
                if (entity is Country)
                {
                    sb.Append(((Country)entity).continent + "$");
                }
                else
                {
                    sb.Append(map.countries[((Province)entity).countryIndex].name + "$");
                }
                for (int r = 0; r < entity.regions.Count; r++)
                {
                    if (r > 0)
                    {
                        sb.Append("*");
                    }
                    Region region = entity.regions [r];
                    for (int p = 0; p < region.latlon.Length; p++)
                    {
                        if (p > 0)
                        {
                            sb.Append(";");
                        }
                        Point2D point = region.latlon [p] * WorldMapGlobe.MAP_PRECISION;
                        sb.Append(Mathf.RoundToInt(point.Xf).ToString() + ",");
                        sb.Append(Mathf.RoundToInt(point.Yf).ToString());
                    }
                }
            }
            return(sb.ToString());
        }