예제 #1
0
        public void ClipHardAtTileBoundary(string fileName)
        {
            string fullFileName = Path.Combine(fixturesPath, fileName);

            Assert.True(File.Exists(fullFileName), "Vector tile exists");
            byte[]     data = File.ReadAllBytes(fullFileName);
            VectorTile vt   = new VectorTile(data);

            Assert.GreaterOrEqual(vt.LayerNames().Count, 1, "At least one layer");
            string geojson = vt.ToGeoJson(0, 0, 0);

            Assert.GreaterOrEqual(geojson.Length, 30, "geojson >= 30 chars");
            foreach (var lyrName in vt.LayerNames())
            {
                VectorTileLayer lyr = vt.GetLayer(lyrName);
                for (int i = 0; i < lyr.FeatureCount(); i++)
                {
                    Debug.WriteLine("{0} lyr:{1} feat:{2}", fileName, lyr.Name, i);
                    VectorTileFeature feat = lyr.GetFeature(i, 0);
                    long extent            = (long)lyr.Extent;
                    foreach (var part in feat.Geometry <int>())
                    {
                        foreach (var geom in part)
                        {
                            Assert.GreaterOrEqual(geom.X, 0, "geom.X equal or greater 0");
                            Assert.GreaterOrEqual(geom.Y, 0, "geom.Y eqaul or greater 0");
                            Assert.LessOrEqual(geom.X, extent, "geom.X less or equal extent");
                            Assert.LessOrEqual(geom.Y, extent, "geom.Y less or equal extent");
                        }
                    }
                }
            }
        }
예제 #2
0
        public void AtLeastOneLayer(string fileName)
        {
            string fullFileName = Path.Combine(fixturesPath, fileName);

            Assert.True(File.Exists(fullFileName), "Vector tile exists");
            byte[]     data = File.ReadAllBytes(fullFileName);
            VectorTile vt   = new VectorTile(data);

            Assert.GreaterOrEqual(vt.LayerNames().Count, 1, "At least one layer");
            string geojson = vt.ToGeoJson(0, 0, 0);

            Assert.GreaterOrEqual(geojson.Length, 30, "geojson >= 30 chars");
            foreach (var lyrName in vt.LayerNames())
            {
                VectorTileLayer lyr = vt.GetLayer(lyrName);
                for (int i = 0; i < lyr.FeatureCount(); i++)
                {
                    Debug.WriteLine("{0} lyr:{1} feat:{2}", fileName, lyr.Name, i);
                    VectorTileFeature feat = lyr.GetFeature(i);
                    long extent            = (long)lyr.Extent;
                    foreach (var part in feat.Geometry <long>())
                    {
                        foreach (var geom in part)
                        {
                            if (geom.X < 0 || geom.Y < 0 || geom.X > extent || geom.Y > extent)
                            {
                                Debug.WriteLine("{0} lyr:{1} feat:{2} x:{3} y:{4}", fileName, lyr.Name, i, geom.X, geom.Y);
                            }
                        }
                    }
                }
            }
        }
예제 #3
0
        public void Clipping(string fileName)
        {
            string fullFileName = Path.Combine(fixturesPath, fileName);

            Assert.True(File.Exists(fullFileName), "Vector tile exists");
            byte[]     data = File.ReadAllBytes(fullFileName);
            VectorTile vt   = new VectorTile(data);

            foreach (var lyrName in vt.LayerNames())
            {
                VectorTileLayer lyr = vt.GetLayer(lyrName);
                for (int i = 0; i < lyr.FeatureCount(); i++)
                {
                    VectorTileFeature feat = lyr.GetFeature(i);
                    //skip features with unknown geometry type
                    if (feat.GeometryType == GeomType.UNKNOWN)
                    {
                        continue;
                    }
                    List <List <Point2d <long> > > geomRaw     = feat.Geometry <long>();
                    List <List <Point2d <long> > > geomClipped = feat.Geometry <long>(0);
                    for (int j = 0; j < geomRaw.Count; j++)
                    {
                        List <Point2d <long> > part        = geomRaw[j];
                        List <Point2d <long> > partClipped = geomClipped[j];
                        // Workaround to compare parts as clipping may or may not change the order of vertices
                        // This only works if no actual clipping is done
                        Assert.False(part.Except(partClipped).Any(), $"{fileName}, feature[{i}], geometry part[{j}]: geometry parts don't match after clipping");
                    }
                }
            }
        }
예제 #4
0
        public void Scaling(string fileName)
        {
            float[] scales       = new float[] { 1.5f, 2.25f, 5.75f, 197.3f };
            string  fullFileName = Path.Combine(fixturesPath, fileName);

            byte[]     data = File.ReadAllBytes(fullFileName);
            VectorTile vt   = new VectorTile(data);

            foreach (var lyrName in vt.LayerNames())
            {
                VectorTileLayer lyr     = vt.GetLayer(lyrName);
                int             featCnt = lyr.FeatureCount();
                for (int idxFeat = 0; idxFeat < featCnt; idxFeat++)
                {
                    VectorTileFeature             feat     = lyr.GetFeature(idxFeat);
                    List <List <Point2d <int> > > rawParts = feat.Geometry <int>();
                    for (int idxPart = 0; idxPart < rawParts.Count; idxPart++)
                    {
                        List <Point2d <int> > rawGeom = rawParts[idxPart];
                        foreach (var scale in scales)
                        {
                            List <List <Point2d <float> > > scaledParts = feat.Geometry <float>(null, scale);
                            List <Point2d <float> >         scaledGeom  = scaledParts[idxPart];
                            for (int idxVertex = 0; idxVertex < rawGeom.Count; idxVertex++)
                            {
                                Point2d <int>   rawVertex    = rawGeom[idxVertex];
                                Point2d <float> scaledVertex = scaledGeom[idxVertex];
                                Assert.AreEqual(scale * (float)rawVertex.X, scaledVertex.X, $"{fileName}, feature[{idxFeat}], geometry part[{idxPart}], vertex[{idxVertex}], scale[{scale}]: X does not match");
                                Assert.AreEqual(scale * (float)rawVertex.Y, scaledVertex.Y, $"{fileName}, feature[{idxFeat}], geometry part[{idxPart}], vertex[{idxVertex}], scale[{scale}]: Y does not match");
                            }
                        }
                    }
                }
            }
        }
예제 #5
0
        public void LazyDecoding(string fileName)
        {
            string fullFileName = Path.Combine(fixturesPath, fileName);

            Assert.True(File.Exists(fullFileName), "Vector tile exists");
            byte[]     data = File.ReadAllBytes(fullFileName);
            VectorTile vt   = new VectorTile(data);

            foreach (var layerName in vt.LayerNames())
            {
                VectorTileLayer layer = vt.GetLayer(layerName);
                for (int i = 0; i < layer.FeatureCount(); i++)
                {
                    VectorTileFeature feat = layer.GetFeature(i);
                    var properties         = feat.GetProperties();
                    foreach (var prop in properties)
                    {
                        Assert.AreEqual(prop.Value, feat.GetValue(prop.Key), "Property values match");
                    }
                    foreach (var geomPart in feat.Geometry <int>())
                    {
                        foreach (var coord in geomPart)
                        {
                            //TODO add Assert
                        }
                    }
                }
            }
            string geojson = vt.ToGeoJson(0, 0, 0);

            Assert.GreaterOrEqual(geojson.Length, 30, "geojson >= 30 chars");
        }
예제 #6
0
        public int ShowAttractions(Geometry geometry)
        {
            int result = 0;

            var request = new SearchRequest();

            request.Projection       = Projection;
            request.Geometry         = geometry;
            request.SearchRadius     = 500.0f;
            request.FilterExpression = "class='attraction'";

            var results = Service.FindFeatures(request);

            for (int i = 0; i < results.FeatureCount; i++)
            {
                VectorTileFeature item = results.GetFeature(i);
                if (item.Geometry is PointGeometry)
                {
                    AddPointOfInterest(item);
                    result += 1;
                }
            }

            return(result);
        }
        /// <summary>
        /// >Geometry in LatLng coordinates instead of internal tile coordinates
        /// </summary>
        /// <param name="feature"></param>
        /// <param name="zoom">Zoom level of the tile</param>
        /// <param name="tileColumn">Column of the tile (OSM tile schema)</param>
        /// <param name="tileRow">Row of the tile (OSM tile schema)</param>
        /// <returns></returns>
        public static List <List <LatLng> > GeometryAsWgs84(
            this VectorTileFeature feature
            , ulong zoom
            , ulong tileColumn
            , ulong tileRow
            )
        {
            List <List <LatLng> > geometryAsWgs84 = new List <List <LatLng> >();

            foreach (var part in feature.Geometry)
            {
#if NET20
                List <LatLng> partAsWgs84 = new List <LatLng>();
                foreach (var partGeom in part)
                {
                    partAsWgs84.Add(partGeom.ToLngLat(zoom, tileColumn, tileRow, feature.Layer.Extent));
                }
                geometryAsWgs84.Add(partAsWgs84);
#else
                geometryAsWgs84.Add(
                    part.Select(g => g.ToLngLat(zoom, tileColumn, tileRow, feature.Layer.Extent)).ToList()
                    );
#endif
            }

            return(geometryAsWgs84);
        }
        public static List <List <LatLng> > GeometryAsWgs84Optimized(
            this VectorTileFeature feature
            , List <List <LatLng> > geometryAsWgs84
            , ulong zoom
            , ulong tileColumn
            , ulong tileRow
            , uint?clipBuffer = null

            )
        {
            foreach (var part in feature.Geometry <long>(clipBuffer, 1.0f))
            {
                geometryAsWgs84.Clear();

                                #if NET20
                List <LatLng> partAsWgs84 = new List <LatLng>();
                foreach (var partGeom in part)
                {
                    partAsWgs84.Add(partGeom.ToLngLat(zoom, tileColumn, tileRow, feature.Layer.Extent));
                }
                geometryAsWgs84.Add(partAsWgs84);
                                #else
                geometryAsWgs84.Add(
                    part.Select(g => g.ToLngLat(zoom, tileColumn, tileRow, feature.Layer.Extent)).ToList()
                    );
                                #endif
            }

            return(geometryAsWgs84);
        }
예제 #9
0
        public override GOFeature ParseFeatureData(VectorTileFeature feature, GOLayer layer)
        {
            IDictionary properties = feature.GetProperties();
            GOFeature   goFeature;

            if (layer.layerType == GOLayer.GOLayerType.Roads)
            {
                goFeature = new GORoadFeature();
            }
            else
            {
                goFeature = new GOFeature();
            }

            goFeature.kind = GOEnumUtils.MapboxToKind(layer.name);

            goFeature.y = layer.defaultLayerY();
            if (properties.Contains("_symbol"))
            {
                goFeature.y = Convert.ToInt64(properties ["_symbol"]) / 10.0f * Global.tilesizeRank;
            }

            goFeature.height = layer.defaultRendering.polygonHeight;

            return(goFeature);
        }
예제 #10
0
        private void Build(VectorTileFeature feature, Rect rect, Texture2D height, GameObject parent, Tile.Parameters parameters)
        {
            foreach (var geometry in feature.GeometryAsWgs84((ulong)parameters.Id.Z, (ulong)parameters.Id.X, (ulong)parameters.Id.Y))
            {
                var meshData = new MeshData();
                //we'll run all visualizers on MeshData here
                var list = geometry.Select(wgs84 => GM.LatLonToMeters(wgs84.Lat, wgs84.Lng).ToVector3xz()).ToList();
                meshData.Vertices = list.Select(vertex =>
                {
                    var cord = vertex - rect.center.ToVector3xz();
                    var rx   = (vertex.x - rect.min.x) / rect.width;
                    var ry   = 1 - (vertex.z - rect.min.y) / rect.height;

                    var h = height == null ? 0 : GetHeightFromColor(height.GetPixel(
                                                                        (int)Mathf.Clamp((rx * 256), 0, 255),
                                                                        (int)Mathf.Clamp((ry * 256), 0, 255)));
                    cord.y += h;

                    return(cord);
                }).ToList();

                foreach (var mod in Modifiers)
                {
                    mod.Run(feature, meshData);
                }

                CreateGameObject(meshData, parent);
            }
        }
예제 #11
0
        public VectorFeatureUnity(VectorTileFeature feature, UnityTile tile, float layerExtent, bool buildingsWithUniqueIds = false)
        {
            Data       = feature;
            Properties = Data.GetProperties();
            Points.Clear();

            //this is a temp hack until we figure out how streets ids works
            if (buildingsWithUniqueIds == true)      //ids from building dataset is big ulongs
            {
                _geom = feature.Geometry <float>();  //and we're not clipping by passing no parameters
            }
            else                                     //streets ids, will require clipping
            {
                _geom = feature.Geometry <float>(0); //passing zero means clip at tile edge
            }

            _rectSizex = tile.Rect.Size.x;
            _rectSizey = tile.Rect.Size.y;

            _geomCount = _geom.Count;
            for (int i = 0; i < _geomCount; i++)
            {
                _pointCount = _geom[i].Count;
                _newPoints  = new List <Vector3>(_pointCount);
                for (int j = 0; j < _pointCount; j++)
                {
                    var point = _geom[i][j];
                    _newPoints.Add(new Vector3((float)(point.X / layerExtent * _rectSizex - (_rectSizex / 2)) * tile.TileScale, 0, (float)((layerExtent - point.Y) / layerExtent * _rectSizey - (_rectSizey / 2)) * tile.TileScale));
                }
                Points.Add(_newPoints);
            }
        }
        public IEnumerable <VectorTileFeature> Wrap(VectorTileFeature feature, double buffer, Func <double[], double[], double, double[]> intersectX)
        {
            //var merged = new List<VectorTileFeature> { feature };
            var left     = Clipper.Clip(feature, 1, -1 - buffer, buffer, 0, intersectX, -1, 2);    //Left world copy;
            var right    = Clipper.Clip(feature, 1, 1 - buffer, 2 + buffer, 0, intersectX, -1, 2); //Right world copy;
            var hasLeft  = left != null;
            var hasRight = right != null;

            if (hasLeft || hasRight)
            {
                var center = Clipper.Clip(feature, 1, -buffer, 1 + buffer, 0, intersectX, -1, 2);//Center world copy;
                if (center != null)
                {
                    yield return(center);
                }

                if (hasLeft)
                {
                    yield return(ShiftFeatureCoords(left, 1));
                }
                if (hasRight)
                {
                    yield return(ShiftFeatureCoords(right, -1));
                }
            }
            else
            {
                yield return(feature);
            }
        }
예제 #13
0
        public CustomFeatureUnity(VectorTileFeature feature, CustomTile tile, float layerExtent, bool buildingsWithUniqueIds = false)
        {
            Data       = feature;
            Properties = Data.GetProperties();
            Points.Clear();
            Tile = tile;

            //this is a temp hack until we figure out how streets ids works
            _geom = buildingsWithUniqueIds ? feature.Geometry <float>() : feature.Geometry <float>(0);

            _rectSizex = tile.Rect.Size.x;
            _rectSizey = tile.Rect.Size.y;

            _geomCount = _geom.Count;
            for (var i = 0; i < _geomCount; i++)
            {
                _pointCount = _geom[i].Count;
                _newPoints  = new List <Vector3>(_pointCount);
                for (var j = 0; j < _pointCount; j++)
                {
                    var point = _geom[i][j];
                    _newPoints.Add(new Vector3((float)(point.X / layerExtent * _rectSizex - (_rectSizex / 2)) * tile.TileScale, 0, (float)((layerExtent - point.Y) / layerExtent * _rectSizey - (_rectSizey / 2)) * tile.TileScale));
                }
                Points.Add(_newPoints);
            }
        }
예제 #14
0
        public MGLSymbol(VectorTileFeature feature, IVectorStyleLayer style)
        {
            Feature = feature;
            Style   = style;

            Class    = feature.Tags.ContainsKey("class") ? feature.Tags["class"].ToString() : string.Empty;
            Subclass = feature.Tags.ContainsKey("subclass") ? feature.Tags["subclass"].ToString() : string.Empty;
            Rank     = feature.Tags.ContainsKey("rank") ? int.Parse(feature.Tags["rank"].ToString()) : 0;
        }
예제 #15
0
        public override void Run(VectorTileFeature feature, MeshData md)
        {
            var count    = md.Vertices.Count;
            var tempList = new Vector3[count * 2];
            var uvList   = new Vector2[count * 2];

            Vector3 lastPos = Vector3.zero;
            Vector3 norm;
            var     lastUv = 0f;

            for (int i = 1; i < count; i++)
            {
                var p1 = md.Vertices[i - 1];
                var p2 = md.Vertices[i];
                var p3 = p2;
                if (i + 1 < md.Vertices.Count)
                {
                    p3 = md.Vertices[i + 1];
                }

                if (lastPos == Vector3.zero)
                {
                    lastPos                 = Vector3.Lerp(p1, p2, 0f);
                    norm                    = GetNormal(p1, lastPos, p2) * Width; //road width
                    tempList[0]             = (lastPos + norm);
                    tempList[count * 2 - 1] = (lastPos - norm);
                    uvList[0]               = new Vector2(0, 0);
                    uvList[count * 2 - 1]   = new Vector2(1, 0);
                }
                var dist = Vector3.Distance(lastPos, p2);
                lastUv += dist;
                lastPos = p2;
                //lastPos = Vector3.Lerp(p1, p2, 1f);
                norm        = GetNormal(p1, lastPos, p3) * Width;
                tempList[i] = (lastPos + norm);
                tempList[2 * count - 1 - i] = (lastPos - norm);

                uvList[i] = new Vector2(0, lastUv);
                uvList[2 * count - 1 - i] = new Vector2(1, lastUv);
            }
            md.Vertices = tempList.ToList();
            md.UV[0].AddRange(uvList);
            var lineTri = new List <int>();
            var n       = md.Vertices.Count / 2;

            for (int i = 0; i < n - 1; i++)
            {
                lineTri.Add(i);
                lineTri.Add(i + 1);
                lineTri.Add(2 * n - 1 - i);

                lineTri.Add(i + 1);
                lineTri.Add(2 * n - i - 2);
                lineTri.Add(2 * n - i - 1);
            }
            md.Triangles.Add(lineTri);
        }
예제 #16
0
 public static void AddSortRankToFeatures(
     this VectorTileLayer tile
     )
 {
     for (int i = 0; i < tile.FeatureCount(); i++)
     {
         VectorTileFeature f = tile.GetFeature(i);
     }
 }
예제 #17
0
        private void ParseLabelLayerToList(List <GOParsedLayer> list, VectorTile vt, GOLabelsLayer layer)
        {
            string[] lyrs = tile.GetLabelsStrings().Split(',');
//			string kindKey = tile.GetPoisKindKey();

            foreach (string l in lyrs)
            {
                VectorTileLayer lyr = vt.GetLayer(l);
                if (lyr != null)
                {
                    int featureCount = lyr.FeatureCount();

                    if (featureCount == 0)
                    {
                        continue;
                    }

                    GOParsedLayer pl = new GOParsedLayer();
                    pl.name        = lyr.Name;
                    pl.labelsLayer = layer;
                    pl.goFeatures  = new List <GOFeature> ();

                    for (int i = 0; i < featureCount; i++)
                    {
                        VectorTileFeature vtf        = lyr.GetFeature(i);
                        IDictionary       properties = vtf.GetProperties();

                        List <List <LatLng> > geomWgs = vtf.GeometryAsWgs84((ulong)goTile.zoomLevel, (ulong)goTile.tileCoordinates.x, (ulong)goTile.tileCoordinates.y, 0);

                        if (geomWgs.Count == 0 || geomWgs[0].Count <= 1)
                        {
                            continue;
                        }

                        GOFeature gf = new GOFeature();
                        gf.properties    = properties;
                        gf.goFeatureType = vtf.GOFeatureType(geomWgs);
                        gf.labelsLayer   = layer;
                        gf.featureIndex  = (Int64)i + vt.LayerNames().IndexOf(lyr.Name);
                        gf.goTile        = goTile;
                        gf = tile.EditLabelData(gf);
                        gf.goFeatureType = GOFeatureType.Label;

                        gf.ConvertAttributes();
                        if (geomWgs.Count > 0)
                        {
                            gf.geometry = geomWgs[0];
                            gf.ConvertGeometries();
                            gf.preloadedLabelData = GOSegment.FindTheLongestStreightSegment(gf.convertedGeometry, 0);
                            AddFatureToList(gf, pl.goFeatures);
                        }
                    }
                    list.Add(pl);
                }
            }
        }
예제 #18
0
        public override void Run(VectorTileFeature feature, MeshData md)
        {
            var uv = new List <Vector2>();

            foreach (var c in md.Vertices)
            {
                uv.Add(new Vector2(c.x, c.z));
            }
            md.UV[0].AddRange(uv);
        }
예제 #19
0
        public override void Run(VectorTileFeature feature, MeshData md)
        {
            if (md.Vertices.Distinct().Count() < 3)
            {
                return;
            }

            var verts = CreateRoofTriangulation(md.Vertices);

            md.Triangles.Add(verts);
        }
예제 #20
0
        public override bool Evaluate(VectorTileFeature feature)
        {
            foreach (var filter in Filters)
            {
                if (filter.Evaluate(feature))
                {
                    return(true);
                }
            }

            return(false);
        }
        private VectorTileFeature Create(Dictionary <string, object> properties, int type, VectorTileGeometry[] geoJsonVTPointCollection)
        {
            var feature = new VectorTileFeature
            {
                Geometry = type == 1 ? geoJsonVTPointCollection[0] :  geoJsonVTPointCollection as object,
                Tags     = properties,
                Type     = type,
            };

            CalcBBox(feature);
            return(feature);
        }
예제 #22
0
        private static async Task <VectorTile> baseTileToVector(object baseTile)
        {
            var tile   = baseTile as Mapbox.VectorTile.VectorTile;
            var result = new VectorTile();

            foreach (var lyrName in tile.LayerNames())
            {
                Mapbox.VectorTile.VectorTileLayer lyr = tile.GetLayer(lyrName);

                var vectorLayer = new VectorTileLayer();
                vectorLayer.Name = lyrName;

                for (int i = 0; i < lyr.FeatureCount(); i++)
                {
                    Mapbox.VectorTile.VectorTileFeature feat = lyr.GetFeature(i);

                    var vectorFeature = new VectorTileFeature();
                    vectorFeature.Extent       = 1;
                    vectorFeature.GeometryType = convertGeometryType(feat.GeometryType);
                    vectorFeature.Attributes   = feat.GetProperties();

                    var vectorGeometry = new List <List <Point> >();

                    foreach (var points in feat.Geometry <int>())
                    {
                        var vectorPoints = new List <Point>();

                        foreach (var coordinate in points)
                        {
                            var dX = (double)coordinate.X / (double)lyr.Extent;
                            var dY = (double)coordinate.Y / (double)lyr.Extent;

                            vectorPoints.Add(new Point(dX, dY));

                            //var newX = Utils.ConvertRange(dX, extent.Left, extent.Right, 0, vectorFeature.Extent);
                            //var newY = Utils.ConvertRange(dY, extent.Top, extent.Bottom, 0, vectorFeature.Extent);

                            //vectorPoints.Add(new Point(newX, newY));
                        }

                        vectorGeometry.Add(vectorPoints);
                    }

                    vectorFeature.Geometry = vectorGeometry;
                    vectorLayer.Features.Add(vectorFeature);
                }

                result.Layers.Add(vectorLayer);
            }

            return(result);
        }
예제 #23
0
        public VectorTileFeature[] SelectLayerFeatures(VectorTile tile, string layerName)
        {
            var layer = tile.GetLayer(layerName);

            var features = new VectorTileFeature[layer.FeatureCount()];

            for (var i = 0; i < features.Length; i++)
            {
                features[i] = layer.GetFeature(i);
            }

            return(features);
        }
예제 #24
0
        public static GOFeatureType GOFeatureType(this VectorTileFeature feature, List <List <LatLng> > geomWgs84)
        {
            GOFeatureType type = GoShared.GOFeatureType.Undefined;

            if (geomWgs84.Count > 1)
            {
                switch (feature.GeometryType)
                {
                case GeomType.POINT:
                    type = GoShared.GOFeatureType.MultiPoint;
                    break;

                case GeomType.LINESTRING:
                    type = GoShared.GOFeatureType.MultiLine;
                    break;

                case GeomType.POLYGON:
                    type = GoShared.GOFeatureType.MultiPolygon;
                    break;

                default:
                    break;
                }
            }
            else if (geomWgs84.Count == 1)                 //singlepart
            {
                switch (feature.GeometryType)
                {
                case GeomType.POINT:
                    type = GoShared.GOFeatureType.Point;
                    break;

                case GeomType.LINESTRING:
                    type = GoShared.GOFeatureType.Line;
                    break;

                case GeomType.POLYGON:
                    type = GoShared.GOFeatureType.Polygon;
                    break;

                default:
                    break;
                }
            }
            else                //no geometry

            {
            }
            return(type);
        }
예제 #25
0
        public static string GetFeatureType(this VectorTileFeature feature, List <List <LatLng> > geomWgs84)
        {
            string type = null;

            if (geomWgs84.Count > 1)
            {
                switch (feature.GeometryType)
                {
                case GeomType.POINT:
                    type = "MultiPoint";
                    break;

                case GeomType.LINESTRING:
                    type = "MultiLineString";
                    break;

                case GeomType.POLYGON:
                    type = "MultiPolygon";
                    break;

                default:
                    break;
                }
            }
            else if (geomWgs84.Count == 1)                 //singlepart
            {
                switch (feature.GeometryType)
                {
                case GeomType.POINT:
                    type = "Point";
                    break;

                case GeomType.LINESTRING:
                    type = "LineString";
                    break;

                case GeomType.POLYGON:
                    type = "Polygon";
                    break;

                default:
                    break;
                }
            }
            else                //no geometry

            {
            }
            return(type);
        }
예제 #26
0
        public override bool Evaluate(VectorTileFeature feature)
        {
            if (feature == null || !feature.Tags.ContainsKey(Key))
            {
                return(false);
            }

            if (feature.Tags[Key] is float ||
                feature.Tags[Key] is int)
            {
                return((float)feature.Tags[Key] <= (float)Value);
            }

            return(false);
        }
예제 #27
0
        public void AddPointOfInterest(VectorTileFeature item)
        {
            var builder = new PointStyleBuilder();

            builder.Size  = 20.0f;
            builder.Color = new Carto.Graphics.Color(230, 100, 100, 200);

            MapPos position = (item.Geometry as PointGeometry).Pos;
            var    point    = new Point(position, builder.BuildStyle());

            point.SetMetaDataElement(VectorElementListener.RouteSearchTitle, new Variant("Properties"));
            point.SetMetaDataElement(VectorElementListener.RouteSearchDescription, new Variant(item.Properties.ToString()));

            overlaySource.Add(point);
        }
예제 #28
0
        public static void DrawLayer(VectorTileLayer layer, Pallete pallete, Graphics graphics, double divisionRatio)
        {
            int featureCount = layer.FeatureCount();

            for (int i = 0; i < featureCount; i++)
            {
                VectorTileFeature feature = layer.GetFeature(i);
                if (feature.GeometryType == GeomType.UNKNOWN)
                {
                    Console.WriteLine("Unknown feature: " + feature);
                    continue;
                }

                featureDrawDictionary[feature.GeometryType](feature, pallete, graphics, divisionRatio);
            }
        }
예제 #29
0
        public static void CreateLayer(VectorTileLayer layer, Pallete pallete, Model3DGroup model3DGroup, Vector2 <int> shiftCoords)
        {
            int featureCount = layer.FeatureCount();

            for (int i = 0; i < featureCount; i++)
            {
                VectorTileFeature feature = layer.GetFeature(i);
                if (feature.GeometryType == GeomType.UNKNOWN)
                {
                    Console.WriteLine("Unknown feature: " + feature);
                    continue;
                }

                featureCreateDictionary[feature.GeometryType](feature, pallete, model3DGroup, shiftCoords);
            }
        }
예제 #30
0
        public void TestVectTile()
        {
            var        pbf = File.ReadAllBytes(@"E:\Downloads\63.pbf");
            VectorTile vt  = new VectorTile(pbf, false);

            foreach (var layerName in vt.LayerNames())
            {
                VectorTileLayer layer = vt.GetLayer(layerName);
                for (int j = 0; j < layer.FeatureCount(); j++)
                {
                    VectorTileFeature feat = layer.GetFeature(j);
                    var ff    = feat.Geometry <long>();
                    var props = feat.GetProperties();
                }
            }
        }