/// <summary> /// Export all splines /// </summary> public static void ExportSplines(string path) { xoff = CourseBase.Info.geoX; zoff = CourseBase.Info.geoY; File export = new File(); export.type = "FeatureCollection"; export.crs.type = "name"; export.crs.properties.name = "+proj=utm +zone=" + CourseBase.Info.utmZone + " +ellps=GRS80 +datum=NAD83 +units=m +no_defs"; List <SplineBase> splines = CourseBase.Curves; for (int i = 0; i < splines.Count; ++i) { File.Feature feature = new File.Feature(); feature.type = "Feature"; feature.id = "id" + i.ToString(); feature.geometry.type = "Polygon"; feature.geometry.coordinates = new List <List <float[]> >(); feature.properties.Layer = splines[i].Layer.name; List <List <float[]> > coordinates = (List <List <float[]> >)feature.geometry.coordinates; coordinates.Add(new List <float[]>()); Vector3[] lines = splines[i].Lines.Lines; for (int j = 0; j < lines.Length; ++j) { float[] xy = new float[2]; xy[0] = xoff + lines[j].x; xy[1] = zoff + lines[j].z; coordinates[0].Add(xy); } export.features.Add(feature); } PlatformBase.IO.WriteText(path, Utility.JsonWrite(export)); }
/// <summary> /// Import splines from file /// </summary> /// <param name="path"></param> public static void ImportSplines(string path) { try { File file = Utility.JsonRead <File>(PlatformBase.IO.ReadText(path)); for (int i = 0; i < file.features.Count; ++i) { File.Feature feature = file.features[i]; if (feature.geometry.type == "Polygon" && feature.geometry.coordinates.GetType() == typeof(Double[][][])) { Double[][][] coordinates = (Double[][][])feature.geometry.coordinates; for (int p = 0; p < coordinates.Length; ++p) { List <Vector3> poly = new List <Vector3>(); for (int t = 0; t < coordinates[p].Length; ++t) { poly.Add(new Vector3((float)coordinates[p][t][0] - CourseBase.Info.geoX, 0, (float)coordinates[p][t][1] - CourseBase.Info.geoY)); } for (int t = 0; t < poly.Count; ++t) { poly[t] = new Vector3(poly[t].x, CourseBase.TerrainHeight(poly[t].x, poly[t].z), poly[t].z); } if (CourseBase.IsHazard(file.features[i].properties.Layer)) { CourseBase.CreateHazard(poly.ToArray(), CourseBase.GetLayer(file.features[i].properties.Layer, CourseBase.HazardLayers), 0, true); } else { CourseBase.CreateSpline(poly.ToArray(), CourseBase.GetLayer(file.features[i].properties.Layer, CourseBase.SplineLayers), 0, true); } } } else if (feature.geometry.type == "Polygon" && feature.geometry.coordinates.GetType() == typeof(object[][])) { object[][] coordinates = (object[][])feature.geometry.coordinates; for (int p = 0; p < coordinates.Length; ++p) { List <Vector3> poly = new List <Vector3>(); for (int t = 0; t < coordinates[p].Length; ++t) { float x = 0; float y = 0; if (coordinates[p][t].GetType() == typeof(object[])) { object[] xy = (object[])coordinates[p][t]; x = System.Convert.ToSingle(xy[0]); y = System.Convert.ToSingle(xy[1]); } if (coordinates[p][t].GetType() == typeof(double[])) { double[] xy = (double[])coordinates[p][t]; x = System.Convert.ToSingle(xy[0]); y = System.Convert.ToSingle(xy[1]); } if (coordinates[p][t].GetType() == typeof(int[])) { int[] xy = (int[])coordinates[p][t]; x = System.Convert.ToSingle(xy[0]); y = System.Convert.ToSingle(xy[1]); } poly.Add(new Vector3(x - CourseBase.Info.geoX, 0, y - CourseBase.Info.geoY)); } for (int t = 0; t < poly.Count; ++t) { poly[t] = new Vector3(poly[t].x, CourseBase.TerrainHeight(poly[t].x, poly[t].z), poly[t].z); } if (CourseBase.IsHazard(file.features[i].properties.Layer)) { CourseBase.CreateHazard(poly.ToArray(), CourseBase.GetLayer(file.features[i].properties.Layer, CourseBase.HazardLayers), 0, true); } else { CourseBase.CreateSpline(poly.ToArray(), CourseBase.GetLayer(file.features[i].properties.Layer, CourseBase.SplineLayers), 0, true); } } } else { Debug.LogError("Feature " + feature.id + "(" + feature.geometry.coordinates.GetType() + ") is not a Polygon"); } } } catch (Exception e) { Debug.LogException(e); } }