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#)

 
 
 
原文地址:https://www.cnblogs.com/youzi-xuchongyou/p/13819139.html