//x,y,z tile index for the zoom level, same as mapzen or bing maps id public void SetTileIndex(Vector3 pos, int Zoom) { ZoomLevel = Zoom; TileIndex = DVector3.FromVector3(pos); //DRect r = MapFuncs.TileBoundsInMeters(new DVector3(pos.x, 0, pos.z), Zoom); //DVector3 c = MapFuncs.TileIdToCenterLatitudeLongitude((int)pos.x, (int)pos.z, Zoom); DRect latlonbounds = MapTools.TileIdToBounds((int)pos.x, (int)pos.z, Zoom); DVector3 c = latlonbounds.Max; PositionMeters = MapTools.LatLonToMeters(c.x, c.z); TileBoundsMeters = new DRect(MapTools.LatLonToMeters(latlonbounds.Min.x, latlonbounds.Min.z), MapTools.LatLonToMeters(latlonbounds.Max.x, latlonbounds.Max.z)); Info = TileBoundsMeters.ToString(); }
//points in lat lon, form a closed loop public static List <List <Vector3> > CreatePolygon(IList geometry, Vector3 Offset) { List <List <Vector3> > lists = new List <List <Vector3> >(); List <Vector3> list = new List <Vector3>(); foreach (IList p in geometry) { double dx = (double)p[0]; double dz = (double)p[1]; Vector3 v = MapTools.LatLonToMeters((float)dz, (float)dx).ToVector3(); v -= Offset; list.Add(v); } lists.Add(list); return(lists); }
public static List <List <Vector3> > CreateMultiPolygon(IList segments, DVector3 Offset) { List <List <Vector3> > lists = new List <List <Vector3> >(); foreach (IList polygon in segments) { List <Vector3> list = new List <Vector3>(); foreach (IList p in polygon) { double dx = (double)p[0]; double dz = (double)p[1]; Vector3 v = MapTools.LatLonToMeters((float)dz, (float)dx).ToVector3(); v -= Offset.ToVector3(); list.Add(v); } lists.Add(list); } return(lists); }
public void CreateRoads(string sData, DVector3 PositionMeters) { TileBoundsMeters = this.transform.parent.GetComponent <MassiveTile>().TileBoundsMeters; mc = transform.parent.Find("terrain").GetComponent <MeshCollider>(); Dictionary <string, object> Data = (Dictionary <string, object>)MiniJSON.Json.Deserialize(sData); List <List <Vector3> > segments = new List <List <Vector3> >(); IList features = (IList)Data["features"]; Roads.Clear(); foreach (IDictionary feature in features) { IDictionary geometry = (IDictionary)feature["geometry"]; IDictionary properties = (IDictionary)feature["properties"]; string geotype = (string)geometry["type"]; string name = OSMTools.GetProperty(properties, "name"); string kind = OSMTools.GetProperty(properties, "kind"); string kind_detail = OSMTools.GetProperty(properties, "kind_detail"); //Debug.Log("Processing:" + name); if (geotype == "LineString") { Road rs = new Road(name, this.gameObject, kind, kind_detail); MassiveFeature mf = rs.go.AddComponent <MassiveFeature>(); mf.SetProperties(properties); rs.is_bridge = mf.is_bridge; for (int i = 0; i < ((IList)geometry["coordinates"]).Count; i++) { IList piece = (IList)((IList)geometry["coordinates"])[i]; double dx = (double)piece[0]; double dz = (double)piece[1]; Vector3 v = MapTools.LatLonToMeters((float)dz, (float)dx).ToVector3(); v -= PositionMeters.ToVector3(); Node n = new Node(v, name); rs.nodes.Add(n); if (i == 0) { //rs.go.transform.position = v; rs.go.layer = LayerMask.NameToLayer("Roads"); } } Roads.Add(rs); } if (geotype == "MultiLineString") { GameObject go = new GameObject(); go.transform.parent = this.transform; MassiveFeature mf = go.AddComponent <MassiveFeature>(); mf.SetProperties(properties); for (int i = 0; i < ((IList)geometry["coordinates"]).Count; i++) { Road rs = new Road(name, go, kind, kind_detail); rs.is_bridge = mf.is_bridge; go.name = name; IList segment = (IList)((IList)geometry["coordinates"])[i]; for (int j = 0; j < segment.Count; j++) { IList piece = (IList)segment[j]; double dx = (double)piece[0]; double dz = (double)piece[1]; Vector3 v = MapTools.LatLonToMeters((float)dz, (float)dx).ToVector3(); v -= PositionMeters.ToVector3(); Node n = new Node(v, name); rs.nodes.Add(n); if ((i == 0) && (j == 0)) { //rs.go.transform.position = v; rs.go.layer = LayerMask.NameToLayer("Roads"); } } Roads.Add(rs); } } } //calculate intersections CalculateIntersections(); CreateRoadGeometry(); //VisualizeNodes(); }
public void Generate(string sData, DVector3 PositionMeters, string AssetPath) { mc = transform.parent.Find("terrain").GetComponent <MeshCollider>(); TileBoundsMeters = this.transform.parent.GetComponent <MassiveTile>().TileBoundsMeters; Data = (Dictionary <string, object>)MiniJSON.Json.Deserialize(sData); IList features = (IList)Data["features"]; foreach (IDictionary feature in features) { IDictionary geometry = (IDictionary)feature["geometry"]; string geotype = (string)geometry["type"]; IDictionary properties = (IDictionary)feature["properties"]; string kind = ""; string kinddetail = ""; string name = "_"; string id = ""; name = OSMTools.GetProperty(properties, "name"); kind = OSMTools.GetProperty(properties, "kind"); kinddetail = OSMTools.GetProperty(properties, "kind_detail"); id = OSMTools.GetProperty(properties, "id"); //if (name == "_") continue; if (!CanWeInclude(AllowKinds, kind)) { continue; } List <List <Vector3> > segments = new List <List <Vector3> >(); if (geotype == "LineString" && CanWeInclude(AllowShapes, "LineString")) { List <Vector3> list = new List <Vector3>(); foreach (IList piece in (IList)geometry["coordinates"]) { double dx = (double)piece[0]; double dz = (double)piece[1]; Vector3 v = MapTools.LatLonToMeters((float)dz, (float)dx).ToVector3(); v -= PositionMeters.ToVector3(); list.Add(v); } list = OSMTools.InsertPoints(list, InterpolateRoadMeters); segments.Add(list); } if (geotype == "MultiLineString" && CanWeInclude(AllowShapes, "MultiLineString")) { foreach (IList piecelist in (IList)geometry["coordinates"]) { List <Vector3> list = new List <Vector3>(); foreach (IList piece in (IList)piecelist) { double dx = (double)piece[0]; double dz = (double)piece[1]; Vector3 v = MapTools.LatLonToMeters((float)dz, (float)dx).ToVector3(); v -= PositionMeters.ToVector3(); list.Add(v); } list = OSMTools.InsertPoints(list, InterpolateRoadMeters); segments.Add(list); } } if (segments.Count > 0) { MeshData md = new MeshData(); Run(segments, md, GetWidthForKind(kind)); GameObject go = new GameObject(name); go.layer = LayerMask.NameToLayer("Roads"); MassiveFeature f = go.AddComponent <MassiveFeature>(); f.SetSegments(segments); f.SetProperties(properties); f.SetType(geotype); f.SetID(id); go.transform.parent = this.transform; go.transform.localPosition = Vector3.zero; // Create the mesh CreateGameObject(md, go, kind); //WriteAsset(go, AssetPath); } } #if UNITY_EDITOR AssetDatabase.SaveAssets(); #endif }