Skyline学习资料以及实用代码汇总
基本知识点:
1.5.2 偏移,俯仰和翻滚角度
摄像机、飞机和对象的偏移(方向),俯仰(倾斜)和翻滚角的定义如下图所示。
代码:
1.测距离:
sgworld.Command.Execute(1034,0);//水平距离量测 sgworld.Command.Execute(1035,0);//空间距离量测 sgworld.Command.Execute(1036,0);//垂直距离量测
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
/*
* 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);
}
}
}
}
//load the xml file
var document = XDocument.Load(@"C:\temp\bob.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);
}
源代码:
#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 }
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 }
10.Skyline二次开发--(1)动态对象自定义路径漫游

范围从 0到 360,0=北。TerraExplorer Pro 通过调整无效值操作将无效值调整到这个范围。

浙公网安备 33010602011771号