• Skyline学习资料以及实用代码汇总


    基本知识点:

    1.5.2 偏移,俯仰和翻滚角度 

    摄像机、飞机和对象的偏移(方向),俯仰(倾斜)和翻滚角的定义如下图所示。
      
          

    1、偏移角   Yaw


            范围从 0到 360,0=北。TerraExplorer Pro 通过调整无效值操作将无效值调整到这个范围。
    2、俯仰角  Pitch
    范围-90°到+90°,+90=从下到上垂直,-90=从上到下垂直。TerraExplorer Pro 通过调整无效值操作将无效值调整到这个范围。

         

    3、翻滚角 Roll
    范围-90°到+90°,0=水平,+90=向右翻滚至垂直,-90=向左翻滚至垂直。TerraExplorer Pro 通过调整无效值操作将无效值调整到这个范围。

       

    代码:

    1.测距离: 

    sgworld.Command.Execute(1034,0);//水平距离量测
    sgworld.Command.Execute(1035,0);//空间距离量测
    sgworld.Command.Execute(1036,0);//垂直距离量测

    2.怎么实现画圆空间查询 

    var newPoint = SGWorld.Creator.GeometryCreator.CreatePointGeometry([circle.Position.X,circle.Position.Y,0]);
    //对newPoint进行缓冲分析得到圆
    //先得到缓冲分析后的Geometry。
    var newCircleGeometry = newPoint.SpatialOperator.buffer(circle.Radius);
    //利用缓冲分析后得到的Geometry得到新的圆,之前可以删除掉。
    var color = SGWorld.Creator.Color(255,0,0);
    var newCircle = SGWorld.Creator.CreatePolygon(newCircleGeometry,color,color,0,'','newCircle');
    //开始空间查询,假如需要查询的图层为featureLayer
    var spatialQueryResult = featureLayer.ExecuteSpatialQuery(newCircleGeometry,1);
    

    3.sharpkml  

    4.Reading a KML (XML) file

    /*
     * RADO OSREDKAR
     * 10.03.2011
    */
    using System;
    using System.Collections.Generic;
    using System.Xml;
    using System.Collections;
    
    namespace Alpcheck2.razredi
    {
        public class KML
        {
            //kml tags found
            bool IS_POINT = false;
            bool IS_LINESTRING = false;
            bool IS_COORDINATE = false;
    
            //kml geometry
            private enum kmlGeometryType
            {
                POINT,
                LINESTRING
            }
            //kml tags
            private enum kmlTagType
            {
                POINT,
                LINESTRING,
                COORDINATES
            }
    
            //return types
            List<Hashtable> PointsCollection = new List<Hashtable>();//all parsed kml points
            List<Hashtable> LinesCollection = new List<Hashtable>();//all parsed kml lines
            Hashtable Point;//single point (part of PointsCollection)
            Hashtable Line;//single line (part of LinesCollection)
            Hashtable Coordinates;//object coordinate
    
            Hashtable KMLCollection = new Hashtable();//parsed KML
    
            private kmlGeometryType? currentGeometry = null;//currently parsed geometry object
            private kmlTagType? currentKmlTag = null;//currently parsed kml tag
    
            private string lastError;
    
            /// <summary>
            /// parse kml, fill Points and Lines collections
            /// </summary>
            /// <param name="fileName">Full ABSOLUTE path to file.</param>
            /// <returns>HashTable</returns>
            public Hashtable KMLDecode (string fileName){
                readKML(fileName);
                if (PointsCollection != null) KMLCollection.Add("POINTS", PointsCollection);
                if (LinesCollection != null) KMLCollection.Add("LINES", LinesCollection);
                return KMLCollection;
            }
    
            /// <summary>
            /// Open kml, loop it and check for tags.
            /// </summary>
            /// <param name="fileName">Full ABSOLUTE path to file.</param>
            private void readKML (string fileName){
                    using (XmlReader kmlread = XmlReader.Create(fileName))
                    {
                        while (kmlread.Read())//read kml node by node
                        {
                            //select type of tag and object
                            switch (kmlread.NodeType)
                            {
                                case XmlNodeType.Element:
                                    //in elements select kml type
                                    switch (kmlread.Name.ToUpper())
                                    {
                                        case "POINT":
                                            currentGeometry = kmlGeometryType.POINT;
                                            Point = new Hashtable();
                                            break;
                                        case "LINESTRING":
                                            currentGeometry = kmlGeometryType.LINESTRING;
                                            Line = new Hashtable();
                                            break;
                                        case "COORDINATES":
                                            currentKmlTag = kmlTagType.COORDINATES;
                                            break;
                                    }
                                    break;
                                case XmlNodeType.EndElement:
                                    //check if any geometry is parsed in add it to collection
                                    switch (kmlread.Name.ToUpper())
                                    {
                                        case "POINT":
                                            if (Point != null) PointsCollection.Add(Point);
                                            //Reinit vars
                                            Point = null;
                                            currentGeometry = null;
                                            currentKmlTag = null;
                                            break;
                                        case "LINESTRING":
                                            if (Line != null) LinesCollection.Add(Line);
                                            //Reinit vars
                                            Line = null;
                                            currentGeometry = null;
                                            currentKmlTag = null;
                                            break;
                                    }
    
                                    break;
                                case XmlNodeType.Text:
                                case XmlNodeType.CDATA:
                                case XmlNodeType.Comment:
                                case XmlNodeType.XmlDeclaration:
                                    //Parse inner object data
                                    switch (currentKmlTag)
                                    {
                                        case kmlTagType.COORDINATES:
                                            parseGeometryVal(kmlread.Value);//try to parse coordinates
                                            break;
                                    }
                                    break;
                            case XmlNodeType.DocumentType:
                                break;
                            default: break;
                            }
                        }
                    }
            }
    
            /// <summary>
            /// Parse selected geometry based on type
            /// </summary>
            /// <param name="tag_value">Value of geometry element.</param>
            protected void parseGeometryVal(string tag_value)
            {
                object value = null;
                switch (currentGeometry)
                {
                    case kmlGeometryType.POINT:
                        parsePoint(tag_value);
                        break;
                    case kmlGeometryType.LINESTRING:
                        parseLine(tag_value);
                        break;
                }
            }
    
            /// <summary>
            /// If geometry is point select element values:
            ///     COORDINATES - add lat & lan to HashTable Point
            /// </summary>
            /// <param name="tag_value">Value of geometry element.</param>
            protected void parsePoint(string tag_value)
            {
                Hashtable value = null;
                string[] coordinates;
                switch (currentKmlTag)
                {
                    case kmlTagType.COORDINATES:
                        //kml point coordinates format is [lat,lan]
                        value = new Hashtable();
                        coordinates = tag_value.Split(',');
                        if (coordinates.Length < 2)lastError = "ERROR IN FORMAT OF POINT COORDINATES";
                        value.Add("LNG", coordinates[0].Trim());
                        value.Add("LAT", coordinates[1].Trim());
                        Point.Add("COORDINATES", value);
                        break;
                }
            }
    
            /// <summary>
            /// If geometry is line select element values:
            ///     COORDINATES - add lat & lan to List
            ///                   add list to HashTable Line
            /// </summary>
            /// <param name="tag_value">Value of geometry element.</param>
            protected void parseLine(string tag_value)
            {
                List<Hashtable> value = null;
                Hashtable linePoint = null;
                string[] vertex;
                string[] coordinates;
                int idx = 0;
                switch (currentKmlTag)
                {
                    case kmlTagType.COORDINATES:
                        //kml coordinates format is [lat,lan]
                        value = new List<Hashtable>();
                        vertex = tag_value.Trim().Split(' ');//Split linestring to vertexes
    
                        foreach (string point in vertex)
                        {
                            coordinates = point.Split(',');
                            if (coordinates.Length < 2) LastError = "ERROR IN FORMAT OF LINESTRING COORDINATES";
                            foreach (string coordinate in coordinates)
                            {
                                linePoint = new Hashtable();
                                linePoint.Add("LNG", coordinates[0]);
                                linePoint.Add("LAT", coordinates[1]);
                                idx++;//index of net point
                                value.Add(linePoint);
                            }
                        }
                        Line.Add("COORDINATES", value);//Add coordinates to line
                        break;
                }
            }
    
            /// <summary>
            /// Last returned error
            /// </summary>
            public string LastError
            {
                get { return lastError; }
                set {
                    //remember error and promote it to caller
                    lastError = value;
                    throw new System.Exception(lastError);
                }
            }
        }
    }
    

     5. c# - 如何解析KML文件以从地标元素检索坐标点? 

    //load the xml file
    var document = XDocument.Load(@"C:	empob.xml");
    var ns = document.Root.Name.Namespace;
    //get every placemark element in the document
    var placemarks = document.Descendants(ns + "Placemark");
    
    //loop through each placemark and separate it into coordinates and bearings
    var coordinates = new List<string>();
    var coordinate = "";
    foreach (var point in placemarks)
    {
        coordinate = point.Descendants(ns + "coordinates").First().Value;
        coordinates.Add(coordinate);
    }
    

      

    6. C#获取照片中Exif信息里GPS经纬度 

    源代码: 

    #region 读取图片中GPS点
    
    /// <summary>
    /// 获取图片中的GPS坐标点
    /// </summary>
    /// <param name=”p_图片路径”>图片路径</param>
    /// <returns>返回坐标【纬度+经度】用”+”分割 取数组中第0和1个位置的值</returns>
    public String fnGPS坐标(String p_图片路径)
    {
    String s_GPS坐标 = “”;
    //载入图片
    Image objImage = Image.FromFile(p_图片路径);
    //取得所有的属性(以PropertyId做排序)
    var propertyItems = objImage.PropertyItems.OrderBy(x => x.Id);
    //暂定纬度N(北纬)
    char chrGPSLatitudeRef = ‘N’;
    //暂定经度为E(东经)
    char chrGPSLongitudeRef = ‘E’;
    foreach (PropertyItem objItem in propertyItems)
    {
    //只取Id范围为0x0000到0x001e
    if (objItem.Id >= 0x0000 && objItem.Id <= 0x001e)
    {
    objItem.Id = 0x0002;
    switch (objItem.Id)
    {
    case 0x0000:
    var query = from tmpb in objItem.Value select tmpb.ToString();
    string sreVersion = string.Join(“.”, query.ToArray());
    break;
    case 0x0001:
    chrGPSLatitudeRef = BitConverter.ToChar(objItem.Value, 0);
    break;
    case 0x0002:
    if (objItem.Value.Length == 24)
    {
    //degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)
    double d = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
    //minutes(將byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)
    double m = BitConverter.ToUInt32(objItem.Value, 8) * 1.0d / BitConverter.ToUInt32(objItem.Value, 12);
    //seconds(將byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)
    double s = BitConverter.ToUInt32(objItem.Value, 16) * 1.0d / BitConverter.ToUInt32(objItem.Value, 20);
    //计算经纬度数值, 如果是南纬, 要乘上(-1)
    double dblGPSLatitude = (((s / 60 + m) / 60) + d) * (chrGPSLatitudeRef.Equals(‘N’) ? 1 : -1);
    string strLatitude = string.Format(“{0:#} deg {1:#}’ {2:#.00}” {3}”, d
    , m, s, chrGPSLatitudeRef);
    //纬度+经度
    s_GPS坐标 += dblGPSLatitude + “+”;
    }
    break;
    case 0x0003:
    //透过BitConverter, 将Value转成Char(‘E’ / ‘W’)
    //此值在后续的Longitude计算上会用到
    chrGPSLongitudeRef = BitConverter.ToChar(objItem.Value, 0);
    break;
    case 0x0004:
    if (objItem.Value.Length == 24)
    {
    //degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)
    double d = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
    //minutes(将byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)
    double m = BitConverter.ToUInt32(objItem.Value, 8) * 1.0d / BitConverter.ToUInt32(objItem.Value, 12);
    //seconds(将byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)
    double s = BitConverter.ToUInt32(objItem.Value, 16) * 1.0d / BitConverter.ToUInt32(objItem.Value, 20);
    //计算精度的数值, 如果是西经, 要乘上(-1)
    double dblGPSLongitude = (((s / 60 + m) / 60) + d) * (chrGPSLongitudeRef.Equals(‘E’) ? 1 : -1);
    }
    break;
    case 0x0005:
    string strAltitude = BitConverter.ToBoolean(objItem.Value, 0) ? “0” : “1”;
    break;
    case 0x0006:
    if (objItem.Value.Length == 8)
    {
    //将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint
    double dblAltitude = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
    }
    break;
    }
    }
    }
    return s_GPS坐标; } #endregion
    

    改进后

     public string GetGPS(string path)
            {
                string gpsValue = "";
                //载入图片
                Image objImage = Image.FromFile(path);
                //取得所有的属性(以PropertyId做排序)
                var propertyItems = objImage.PropertyItems.OrderBy(x => x.Id);
                //暂定纬度N(北纬)
                char chrGPSLatitudeRef = 'N';
                //暂定经度为E(东经)
                char chrGPSLongitudeRef = 'E';
                foreach (PropertyItem objItem in propertyItems)
                {
                    //只取Id范围为0x0000到0x001e
                    if (objItem.Id >= 0x0000 && objItem.Id <= 0x001e)
                    {
                        objItem.Id = 0x0002;
                        switch (objItem.Id)
                        {
                            case 0x0000:
                                var query = from tmpb in objItem.Value select tmpb.ToString();
                                string sreVersion = string.Join(".", query.ToArray());
                                break;
                            case 0x0001:
                                chrGPSLatitudeRef = BitConverter.ToChar(objItem.Value, 0);
                                break;
                            case 0x0002:
                                var ss = objItem.Value;
                                if (objItem.Value.Length == 24)
                                {
                                    //degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)
                                    double d = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
                                    //minutes(將byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)
                                    double m = BitConverter.ToUInt32(objItem.Value, 8) * 1.0d / BitConverter.ToUInt32(objItem.Value, 12);
                                    //seconds(將byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)
                                    double s = BitConverter.ToUInt32(objItem.Value, 16) * 1.0d / BitConverter.ToUInt32(objItem.Value, 20);
                                    //计算经纬度数值, 如果是南纬, 要乘上(-1)
                                    double dblGPSLatitude = (((s / 60 + m) / 60) + d) * (chrGPSLatitudeRef.Equals('N') ? 1 : -1);
                                    string strLatitude = string.Format("{0:#} deg {1:#}' {2:#.00}" {3}", d
    , m, s, chrGPSLatitudeRef); ;
                                    //纬度+经度
                                    gpsValue += dblGPSLatitude + ",";
                                }
                                break;
                            case 0x0003:
                                //透过BitConverter, 将Value转成Char(‘E’ / ‘W’)
                                //此值在后续的Longitude计算上会用到
                                chrGPSLongitudeRef = BitConverter.ToChar(objItem.Value, 0);
                                break;
                            case 0x0004:
                                if (objItem.Value.Length == 24)
                                {
                                    //degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)
                                    double d = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
                                    //minutes(将byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)
                                    double m = BitConverter.ToUInt32(objItem.Value, 8) * 1.0d / BitConverter.ToUInt32(objItem.Value, 12);
                                    //seconds(将byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)
                                    double s = BitConverter.ToUInt32(objItem.Value, 16) * 1.0d / BitConverter.ToUInt32(objItem.Value, 20);
                                    //计算精度的数值, 如果是西经, 要乘上(-1)
                                    double dblGPSLongitude = (((s / 60 + m) / 60) + d) * (chrGPSLongitudeRef.Equals('E') ? 1 : -1);
                                }
                                break;
                            case 0x0005:
                                string strAltitude = BitConverter.ToBoolean(objItem.Value, 0) ? "0" : "1";
                                break;
                            case 0x0006:
                                if (objItem.Value.Length == 8)
                                {
                                    //将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint
                                    double dblAltitude = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
                                }
                                break;
                        }
                    }
                }
                objImage.Dispose();
                return gpsValue;
            }
    

      

    7. C#如何遍历某个文件夹中的所有子文件和子文件夹(循环递归遍历多层)  

    public void Director(string dir,List<string> list)
     {
          DirectoryInfo d = new DirectoryInfo(dir);
          FileInfo[] files = d.GetFiles();//文件
          DirectoryInfo[] directs = d.GetDirectories();//文件夹
          foreach (FileInfo f in files)
          {
               list.Add(f.Name);//添加文件名到列表中  
          }
          //获取子文件夹内的文件列表,递归遍历  
          foreach (DirectoryInfo dd in directs)
          {
                Director(dd.FullName, list);
          } 
     }
    

      

    8.求时间差,时分秒

      

    DateTime dtone = Convert.ToDateTime("2010-11-1 03:00:00");
    DateTime dttwo = Convert.ToDateTime("2010-12-5 04:04:01");
    TimeSpan ts = dttwo - dtone;
           
    //这样就能得到天数、小时、分差
     string str1=ts.Days + "天" + ts.Hours + "小时" + ts.Minutes + "分"+ts.Seconds+"秒<br>";
    //所有时间换去 总计天数、小时、分钟
     string str2=ts.TotalDays + "天<br>" + ts.TotalHours + "小时<br>" + ts.TotalMinutes + "分<br>";
     Response.Write(str1+str2);
    
    //运行以上代码,可以得到这样的结果:
    //34天1小时4分1秒
    //34.0444560185185天
    //817.066944444444小时
    //49024.0166666667分
    

      

     1 using System;
     2 using System.Diagnostics;
     3 using System.Threading;
     4 class Program
     5 {
     6     static void Main(string[] args)
     7     {
     8         Stopwatch stopWatch = new Stopwatch();
     9         stopWatch.Start();
    10         Thread.Sleep(10000);
    11         stopWatch.Stop();
    12         // Get the elapsed time as a TimeSpan value.
    13         TimeSpan ts = stopWatch.Elapsed;
    14 
    15         // Format and display the TimeSpan value.
    16         string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
    17             ts.Hours, ts.Minutes, ts.Seconds,
    18             ts.Milliseconds / 10);
    19         Console.WriteLine("RunTime " + elapsedTime);
    20     }
    21 }
    View Code

     9.打开文件夹选择多个文件

      

     1 using (OpenFileDialog fileDialog = new OpenFileDialog())
     2             {
     3                 fileDialog.Title = "请选择文件";
     4                 fileDialog.Filter = "kml files (*.cpt)|*.cpt|All files (*.*)|*.*";
     5                 fileDialog.FilterIndex = 1;
     6                 fileDialog.InitialDirectory = SamplesDirectory;
     7                 fileDialog.Multiselect = true;
     8 
     9                 if (fileDialog.ShowDialog() == DialogResult.OK)
    10                 {
    11                     foreach (string file in fileDialog.FileNames)
    12                     {
    13                         string fileName = System.IO.Path.GetFileName(file);
    14                         ISGWorld701 sgworld = new SGWorld701();
    15                         IPosition701 tower2Position = sgworld.Creator.CreatePosition(120, 30, 0, AltitudeTypeCode.ATC_TERRAIN_RELATIVE, 0, 0, 0);
    16                         sgworld.Creator.CreatePointCloudModel(file, tower2Position, null, fileName);
    17                     }
    18 
    19                 }
    20 
    21             }
    View Code

     10.Skyline二次开发--(1)动态对象自定义路径漫游

    网站:

      官网论坛二次开发模块

      GIS派-shaoge

      Skyline TerraExplorer 7.0- 扩展信息树

      Skyline 7.0 二次开发示例代码下载

      skyline 5

      Skyline 二次开发鼠标获取三维坐标

      Skyline桌面二次开发之路径漫游(C#)

     
     
     
  • 相关阅读:
    js递归函数使用介绍
    js获取checkbox复选框获取选中的选项
    分享:Oracle 系统变量函数用法说明
    jQuery CSS()方法改变CSS样式实例解析
    jQuery添加/改变/移除CSS类
    php实现文件下载代码一例
    jquery 获取URL参数并转码的例子
    Python无限元素列表实例教程
    MSSQL数据导出到MYSQL
    .NET CORE控制器里的方法取传参的坑
  • 原文地址:https://www.cnblogs.com/youzi-xuchongyou/p/13819139.html
Copyright © 2020-2023  润新知