sqlcoordinate.cs
来自「C#高级编程第6版随书源代码 值得下载」· CS 代码 · 共 141 行
CS
141 行
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
namespace Wrox.ProCSharp.SqlServer
{
public enum Orientation
{
NorthEast,
NorthWest,
SouthEast,
SouthWest
}
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native)]
public struct SqlCoordinate : INullable
{
private int longitude;
private int latitude;
private bool isNull;
public SqlCoordinate(int longitude, int latitude)
{
isNull = false;
this.longitude = longitude;
this.latitude = latitude;
}
public SqlCoordinate(int longitudeDegrees, int longitudeMinutes,
int longitudeSeconds, int latitudeDegrees, int latitudeMinutes,
int latitudeSeconds, Orientation orientation)
{
isNull = false;
this.longitude = longitudeSeconds + 60 * longitudeMinutes + 3600 *
longitudeDegrees;
this.latitude = latitudeSeconds + 60 * latitudeMinutes + 3600 *
latitudeDegrees;
switch (orientation)
{
case Orientation.SouthWest:
longitude = -longitude;
latitude = -latitude;
break;
case Orientation.SouthEast:
longitude = -longitude;
break;
case Orientation.NorthWest:
latitude = -latitude;
break;
}
}
public override string ToString()
{
if (this.isNull)
return null;
char northSouth = longitude > 0 ? 'N' : 'S';
char eastWest = latitude > 0 ? 'E' : 'W';
int longitudeDegrees = Math.Abs(longitude) / 3600;
int remainingSeconds = Math.Abs(longitude) % 3600;
int longitudeMinutes = remainingSeconds / 60;
int longitudeSeconds = remainingSeconds % 60;
int latitudeDegrees = Math.Abs(latitude) / 3600;
remainingSeconds = Math.Abs(latitude) % 3600;
int latitudeMinutes = remainingSeconds / 60;
int latitudeSeconds = remainingSeconds % 60;
return String.Format("{0}°{1}'{2}\"{3},{4}°{5}'{6}\"{7}",
longitudeDegrees, longitudeMinutes, longitudeSeconds, northSouth,
latitudeDegrees, latitudeMinutes, latitudeSeconds, eastWest);
}
public bool IsNull
{
get
{
return isNull;
}
}
public static SqlCoordinate Null
{
get
{
SqlCoordinate c = new SqlCoordinate();
c.isNull = true;
return c;
}
}
public static SqlCoordinate Parse(SqlString s)
{
if (s.IsNull)
return SqlCoordinate.Null;
try
{
string[] coordinates = s.Value.Split(',');
char[] separators = { '°', '\'', '\"' };
string[] longitudeVals = coordinates[0].Split(separators);
string[] latitudeVals = coordinates[1].Split(separators);
Orientation orientation;
if (longitudeVals[3] == "N" && latitudeVals[3] == "E")
orientation = Orientation.NorthEast;
else if (longitudeVals[3] == "S" && latitudeVals[3] == "W")
orientation = Orientation.SouthWest;
else if (longitudeVals[3] == "S" && latitudeVals[3] == "E")
orientation = Orientation.SouthEast;
else
orientation = Orientation.NorthWest;
return new SqlCoordinate(
int.Parse(longitudeVals[0]), int.Parse(longitudeVals[1]),
int.Parse(longitudeVals[2]),
int.Parse(latitudeVals[0]), int.Parse(latitudeVals[1]),
int.Parse(latitudeVals[2]), orientation);
}
catch (Exception ex)
{
throw new ArgumentException(
"Argument has a wrong syntax. " +
"This syntax is required: 37°47\'0\"N,122°26\'0\"W",
ex.Message);
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?