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); } } }
public static GOParsedLayer Combine(GOParsedLayer pl) { if (pl.goFeatures.Count == 0) { return(pl); } if (pl.goLayer.layerType == GOLayer.GOLayerType.Roads) { return(pl); } GOFeature feature = (GOFeature)pl.goFeatures [0]; for (int i = 1; i < pl.goFeatures.Count; i++) { List <Vector3> verts = feature.preloadedMeshData.vertices.ToList(); List <int> triangles = feature.preloadedMeshData.triangles.ToList(); List <Vector2> uvs = feature.preloadedMeshData.uv.ToList(); GOFeature f = (GOFeature)pl.goFeatures [i]; verts.AddRange(f.preloadedMeshData.vertices); int vertscount = feature.preloadedMeshData.vertices.Count(); triangles.AddRange(f.preloadedMeshData.triangles.Select(x => x + vertscount).ToList()); uvs.AddRange(f.preloadedMeshData.uv); feature.preloadedMeshData.vertices = verts.ToArray(); feature.preloadedMeshData.triangles = triangles.ToArray(); feature.preloadedMeshData.uv = uvs.ToArray(); } pl.goFeatures.Clear(); pl.goFeatures.Add(feature); return(pl); }
public IEnumerator BuildLayer(GOParsedLayer parsedLayer, bool delayedLoad) { GOLayer goLayer = parsedLayer.goLayer; Profiler.BeginSample("[GoMap] [BuildLayer] game object"); GameObject parent = null; parent = new GameObject(); parent.name = parsedLayer.name; parent.transform.parent = this.transform; if (parsedLayer.goLayer != null) { parent.SetActive(!goLayer.startInactive); } else { parent.SetActive(!map.pois.startInactive); } Profiler.EndSample(); int featureCount = parsedLayer.goFeatures.Count; if (featureCount == 0) { yield break; } IList iList = new List <GOFeature> (); for (int i = 0; i < featureCount; i++) { GOFeature goFeature = (GOFeature)parsedLayer.goFeatures [i]; if (goFeature.goFeatureType == GOFeatureType.Undefined || goFeature.goFeatureType == GOFeatureType.MultiPoint) { continue; } if (goFeature.goFeatureType == GOFeatureType.Point || goFeature.goFeatureType == GOFeatureType.Label) //POIS { goFeature.parent = parent; iList.Add(goFeature); continue; } if (goLayer.useOnly.Length > 0 && !goLayer.useOnly.Contains(goFeature.kind)) { continue; } if (goLayer.avoid.Length > 0 && goLayer.avoid.Contains(goFeature.kind)) { continue; } if (goLayer.layerType == GOLayer.GOLayerType.Roads) { if (goFeature.goFeatureType != GOFeatureType.Line && goFeature.goFeatureType != GOFeatureType.MultiLine) { continue; } GORoadFeature grf = (GORoadFeature)goFeature; if ((grf.isBridge && !goLayer.useBridges) || (grf.isTunnel && !goLayer.useTunnels) || (grf.isLink && !goLayer.useBridges)) { continue; } } goFeature.parent = parent; iList.Add(goFeature); } // Profiler.BeginSample("[GoMap] [BuildLayer] merge roads"); // if (goLayer.layerType == GOLayer.GOLayerType.Roads) { // iList = GORoadFeature.MergeRoads (iList); // } // Profiler.EndSample (); int n = 100; for (int i = 0; i < iList.Count; i += n) { for (int k = 0; k < n; k++) { if (i + k >= iList.Count) { // yield return null; break; } GOFeature r = (GOFeature)iList [i + k]; IEnumerator routine = r.BuildFeature(this, delayedLoad); if (routine != null) { if (Application.isPlaying) { StartCoroutine(routine); } else { GORoutine.start(routine, this); } } } // yield return null; } // // yield return null; }
private void ParsePOILayerToList(List <GOParsedLayer> list, VectorTile vt, GOPOILayer layer) { string[] lyrs = tile.GetPoisStrings().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.poiLayer = layer; pl.goFeatures = new List <GOFeature> (); for (int i = 0; i < featureCount; i++) { VectorTileFeature vtf = lyr.GetFeature(i); IDictionary properties = vtf.GetProperties(); GOPOIKind kind = GOEnumUtils.PoiKindToEnum((string)properties[kindKey]); GOPOIRendering rendering = layer.GetRenderingForPoiKind(kind); if (kind == GOPOIKind.UNDEFINED || rendering == null) { continue; } List <List <LatLng> > geomWgs = vtf.GeometryAsWgs84((ulong)goTile.zoomLevel, (ulong)goTile.tileCoordinates.x, (ulong)goTile.tileCoordinates.y, 0); GOFeature gf = new GOFeature(); gf.poiKind = kind; gf.goTile = goTile; gf.properties = properties; gf.attributes = GOFeature.PropertiesToAttributes(gf.properties); gf.goFeatureType = vtf.GOFeatureType(geomWgs); if (gf.goFeatureType == GOFeatureType.Undefined) { continue; } gf.poiLayer = layer; gf.poiRendering = rendering; gf.featureIndex = (Int64)i + vt.LayerNames().IndexOf(lyr.Name); gf = tile.EditFeatureData(gf); gf.ConvertAttributes(); if (geomWgs.Count > 0 && gf.goFeatureType == GOFeatureType.Point) { gf.geometry = geomWgs [0]; gf.ConvertPOIGeometries(); AddFatureToList(gf, pl.goFeatures); } } list.Add(pl); } } }
private void ParseGOLayerToList(List <GOParsedLayer> list, VectorTile vt, GOLayer layer) { string[] lyrs = tile.GetLayersStrings(layer).Split(','); 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.goLayer = layer; pl.goFeatures = new List <GOFeature> (); int indexOfLayer = vt.LayerNames().IndexOf(lyr.Name); for (int i = 0; i < featureCount; i++) { VectorTileFeature vtf = lyr.GetFeature(i); List <List <LatLng> > geomWgs = vtf.GeometryAsWgs84((ulong)goTile.zoomLevel, (ulong)goTile.tileCoordinates.x, (ulong)goTile.tileCoordinates.y, 0); GOFeature gf; if (layer.layerType == GOLayer.GOLayerType.Roads) { gf = new GORoadFeature(); } else { gf = new GOFeature(); } gf.properties = vtf.GetProperties(); gf.attributes = GOFeature.PropertiesToAttributes(gf.properties); gf.goFeatureType = vtf.GOFeatureType(geomWgs); gf.layer = layer; gf.featureIndex = (Int64)i; gf.layerIndex = indexOfLayer; gf.featureCount = featureCount; gf = tile.EditFeatureData(gf); gf.goTile = goTile; // gf.setRenderingOptions (); gf.ConvertAttributes(); if (geomWgs.Count > 0) { switch (gf.goFeatureType) { case GOFeatureType.Line: gf.geometry = geomWgs [0]; gf.ConvertGeometries(); AddFatureToList(gf, pl.goFeatures); break; case GOFeatureType.Polygon: gf.geometry = geomWgs[0]; gf.ConvertGeometries(); AddFatureToList(gf, pl.goFeatures); break; case GOFeatureType.MultiLine: foreach (IList geometry in geomWgs) { float indexMulti = (((float)geomWgs.IndexOf((List <LatLng>)geometry) + 1) * (i + 1) / geomWgs.Count); GOFeature gfm; if (layer.layerType == GOLayer.GOLayerType.Roads) { gfm = new GORoadFeature((GORoadFeature)gf); } else { gfm = new GOFeature(gf); } // gfm.index = indexMulti; gfm.geometry = geometry; gfm.ConvertGeometries(); AddFatureToList(gfm, pl.goFeatures); } break; case GOFeatureType.MultiPolygon: foreach (IList geometry in geomWgs) { List <Vector3> convertedSubject = null; List <List <Vector3> > convertedClips = new List <List <Vector3> >(); for (int j = 0; j < geomWgs.Count; j++) //Clip ascending { IList p = geomWgs [j]; List <Vector3> convertedP = GOFeature.CoordsToVerts(p, layer.layerType == GOLayer.GOLayerType.Buildings); if (GOFeature.IsClockwise(convertedP)) { convertedSubject = convertedP; } else { //Add clip convertedClips.Add(convertedP); } //Last one if (j == geomWgs.Count - 1 || (j < geomWgs.Count - 1 && GOFeature.IsGeoPolygonClockwise(geomWgs [j + 1]) && convertedSubject != null)) { GOFeature gfm = new GOFeature(gf); // gfm.index = (i +1)*j; gfm.convertedGeometry = convertedSubject; gfm.clips = convertedClips; AddFatureToList(gfm, pl.goFeatures); convertedSubject = null; convertedClips = new List <List <Vector3> >(); } } } break; } } } if (goTile.combineFeatures) { pl = GOCombineFeatures.Combine(pl); } list.Add(pl); } } }
private void ParseTilesetsToList(List <GOParsedLayer> list, VectorTile vt, GOTilesetLayer[] tilesets) { foreach (GOTilesetLayer tileSet in tilesets) { string kind = string.IsNullOrEmpty(tileSet.TilesetKindProperty)? tileSet.TilesetKindProperty : "kind"; VectorTileLayer lyr = vt.GetLayer(tileSet.TilesetName); if (lyr != null) { int featureCount = lyr.FeatureCount(); if (featureCount == 0) { continue; } GOParsedLayer pl = new GOParsedLayer(); pl.name = lyr.Name; pl.tilesetLayer = tileSet; pl.goFeatures = new List <GOFeature>(); for (int i = 0; i < featureCount; i++) { VectorTileFeature vtf = lyr.GetFeature(i); List <List <LatLng> > geomWgs = vtf.GeometryAsWgs84((ulong)goTile.zoomLevel, (ulong)goTile.tileCoordinates.x, (ulong)goTile.tileCoordinates.y, 0); GOFeature gf = new GOFeature(); gf.properties = vtf.GetProperties(); gf.attributes = GOFeature.PropertiesToAttributes(gf.properties); gf.goFeatureType = vtf.GOFeatureType(geomWgs); gf.tileSetKind = kind; gf.tilesetLayer = tileSet; gf.goTile = goTile; gf.featureIndex = (Int64)i; //gf.layerIndex = indexOfLayer; gf.featureCount = featureCount; //gf = tile.EditFeatureData(gf); gf.goTile = goTile; gf.ConvertAttributes(); if (gf.goFeatureType == GOFeatureType.Undefined) { continue; } string name = "Dataset " + gf.goFeatureType.ToString(); //Debug.Log(name); if (geomWgs.Count > 0 && (gf.goFeatureType == GOFeatureType.Point || gf.goFeatureType == GOFeatureType.MultiPoint)) //Probably needs a fix for multi points { //GOPOIKind kind = GOEnumUtils.PoiKindToEnum((string)properties[kindKey]); GOTilesetPOIRendering rendering = tileSet.TilesetPOIRenderingForKind(kind); if (rendering == null) { continue; } gf.geometry = geomWgs[0]; gf.tileSetPoiRendering = rendering; gf.name = name; gf.ConvertPOIGeometries(); AddFatureToList(gf, pl.goFeatures); } else if (geomWgs.Count > 0) { switch (gf.goFeatureType) { case GOFeatureType.Line: GOTilesetLINERendering lineRendering = tileSet.TilesetLINERenderingForKind(kind); if (lineRendering == null) { continue; } gf.geometry = geomWgs[0]; gf.ConvertGeometries(); gf.tileSetLineRendering = lineRendering; gf.name = name; gf.height = lineRendering.height; AddFatureToList(gf, pl.goFeatures); break; case GOFeatureType.Polygon: GOTilesetPOLYGONRendering polygonRendering = tileSet.TilesetPOLYGONRenderingForKind(kind); if (polygonRendering == null) { continue; } gf.geometry = geomWgs[0]; gf.ConvertGeometries(); gf.name = name; gf.tileSetPolygonRendering = polygonRendering; gf.height = polygonRendering.height; AddFatureToList(gf, pl.goFeatures); break; case GOFeatureType.MultiLine: lineRendering = tileSet.TilesetLINERenderingForKind(kind); if (lineRendering == null) { continue; } foreach (IList geometry in geomWgs) { float indexMulti = (((float)geomWgs.IndexOf((List <LatLng>)geometry) + 1) * (i + 1) / geomWgs.Count); GOFeature gfm = new GOFeature(gf); gf.name = name; gfm.geometry = geometry; gfm.ConvertGeometries(); gf.tileSetLineRendering = lineRendering; gf.height = lineRendering.height; AddFatureToList(gfm, pl.goFeatures); } break; case GOFeatureType.MultiPolygon: foreach (IList geometry in geomWgs) { polygonRendering = tileSet.TilesetPOLYGONRenderingForKind(kind); if (polygonRendering == null) { continue; } List <Vector3> convertedSubject = null; List <List <Vector3> > convertedClips = new List <List <Vector3> >(); for (int j = 0; j < geomWgs.Count; j++) { //Clip ascending IList p = geomWgs[j]; List <Vector3> convertedP = GOFeature.CoordsToVerts(p, false); if (GOFeature.IsClockwise(convertedP)) { convertedSubject = convertedP; } else { //Add clip convertedClips.Add(convertedP); } //Last one if (j == geomWgs.Count - 1 || (j < geomWgs.Count - 1 && GOFeature.IsGeoPolygonClockwise(geomWgs[j + 1]) && convertedSubject != null)) { GOFeature gfm = new GOFeature(gf); // gfm.index = (i +1)*j; gfm.convertedGeometry = convertedSubject; gfm.clips = convertedClips; gf.tileSetPolygonRendering = polygonRendering; gf.name = name; AddFatureToList(gfm, pl.goFeatures); convertedSubject = null; convertedClips = new List <List <Vector3> >(); } } } break; } } } list.Add(pl); } } }