ArcGIS Pro SDK (九)几何 16 单位
文章目录
环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0
1 角度单位
1.1 在度和弧度之间转换
// 将 45 度转换为弧度
double radians = AngularUnit.Degrees.ConvertToRadians(45);
// 将 PI 转换为度
double degrees = AngularUnit.Degrees.ConvertFromRadians(Math.PI);
1.2 使用工厂代码创建角度单位
try
{
// 创建一个格拉德单位
var grad = AngularUnit.CreateAngularUnit(9105);
string unitName = grad.Name; // Grad
double conversionFactor = grad.ConversionFactor; // 0.015708
double radiansPerUnit = grad.RadiansPerUnit;
int factoryCode = grad.FactoryCode; // 9105
// 将 10 格拉德转换为度
double val = grad.ConvertTo(10, AngularUnit.Degrees);
// 将 10 弧度转换为格拉德
val = grad.ConvertFromRadians(10);
}
catch (ArgumentException)
{
// 在以下场景中,CreateAngularUnit 将抛出 ArgumentException:
// - 如果使用的工厂代码是非角度工厂代码(例如,它对应于平方米,这是一个面积单位代码)
// - 如果使用的工厂代码无效(例如,它是负数或不对应任何工厂代码)
}
1.3 创建自定义角度单位
// 自定义单位 - 每单位 3 弧度
var myAngularUnit = AngularUnit.CreateAngularUnit("myCustomAngularUnit", 3);
string Name = myAngularUnit.Name; // myCustomAngularUnit
double Factor = myAngularUnit.ConversionFactor; // 3
int Code = myAngularUnit.FactoryCode; // 0 因为它是自定义角度单位
double radiansUnit = myAngularUnit.RadiansPerUnit; // 3
// 将 10 度转换为自定义单位
double converted = AngularUnit.Degrees.ConvertTo(10, myAngularUnit);
// 将其转换回度
converted = myAngularUnit.ConvertTo(converted, AngularUnit.Degrees);
// 将 1 弧度转换为自定义角度单位
converted = myAngularUnit.ConvertFromRadians(1);
// 获取 WKT
string wkt = myAngularUnit.Wkt;
// 从此 WKT 创建一个角度单位
var anotherAngularUnit = AngularUnit.CreateAngularUnit(wkt);
// anotherAngularUnit.ConversionFactor = 3
// anotherAngularUnit.FactoryCode = 0
// anotherAngularUnit.RadiansPerUnit = 3
2 线性单位
2.1 在英尺和米之间转换
// 将 10 英尺转换为米
double metres = LinearUnit.Feet.ConvertToMeters(10);
// 将 20 米转换为英尺
double feet = LinearUnit.Feet.ConvertFromMeters(20.0);
2.2 在厘米和毫米之间转换
// 将 11 厘米转换为毫米
double mm = LinearUnit.Centimeters.ConvertTo(11, LinearUnit.Millimeters);
// 将结果转换回厘米
double cm = LinearUnit.Millimeters.ConvertTo(mm, LinearUnit.Centimeters);
// 将毫米结果转换回米
double meters = LinearUnit.Millimeters.ConvertToMeters(mm);
2.3 使用工厂代码创建线性单位
try
{
// 创建一个 1936 年英国英尺单位
var britFoot = LinearUnit.CreateLinearUnit(9095);
string unitName = britFoot.Name; // "Foot_British_1936"
double conversionFactor = britFoot.ConversionFactor; // 0.3048007491
double metersPerUnit = britFoot.MetersPerUnit;
int factoryCode = britFoot.FactoryCode; // 9095
// 将 10 个 1936 年英国英尺转换为厘米
double val = britFoot.ConvertTo(10, LinearUnit.Centimeters);
// 将 10 米转换为 1936 年英国英尺
val = britFoot.ConvertFromMeters(10);
}
catch (ArgumentException)
{
// 在以下场景中,CreateLinearUnit 将抛出 ArgumentException:
// - 如果使用的工厂代码是非线性工厂代码(例如,它对应于平方米,这是一个面积单位代码)
// - 如果使用的工厂代码无效(例如,它是负数或不对应任何工厂代码)
}
2.4 创建自定义线性单位
// 创建一个自定义每 myLinearUnit 有 0.33 米
var myLinearUnit = LinearUnit.CreateLinearUnit("myCustomLinearUnit", 0.33);
string name = myLinearUnit.Name; // myCustomLinearUnit
double convFactor = myLinearUnit.ConversionFactor; // 0.33
int code = myLinearUnit.FactoryCode; // 0 自定义单位
double metersUnit = myLinearUnit.MetersPerUnit; // 0.33
string toString = myLinearUnit.ToString(); // 与 Name 相同 - myCustomLinearUnit
// 将 10 厘米转换为 myLinearUnit
double convertedVal = LinearUnit.Centimeters.ConvertTo(10, myLinearUnit);
// 获取 WKT
string lu_wkt = myLinearUnit.Wkt;
// 从此 WKT 创建一个线性单位
var anotherLinearUnit = LinearUnit.CreateLinearUnit(lu_wkt);
// anotherLinearUnit.ConversionFactor = 0.33
// anotherLinearUnit.FactoryCode = 0
// anotherLinearUnit.MetersPerUnit = 0.33
3 面积单位
3.1 在平方英尺和平方米之间转换
// 将 700 平方米转换为平方英尺
double sqFeet = AreaUnit.SquareFeet.ConvertFromSquareMeters(700);
// 将 1000 平方英尺转换为平方米
double sqMeters = AreaUnit.SquareFeet.ConvertToSquareMeters(1000);
3.2 在公顷和英亩之间转换
// 将 2 公顷转换为英亩
double acres = AreaUnit.Hectares.ConvertTo(2, AreaUnit.Acres);
3.3 在公顷和平方英里之间转换
// 将 300 公顷转换为平方英里
double sqMiles = AreaUnit.Hectares.ConvertTo(300, AreaUnit.SquareMiles);
3.4 各种单位的平方米数
double sqMetersPerUnit = AreaUnit.Acres.SquareMetersPerUnit;
sqMetersPerUnit = AreaUnit.Ares.SquareMetersPerUnit;
sqMetersPerUnit = AreaUnit.Hectares.SquareMetersPerUnit;
sqMetersPerUnit = AreaUnit.SquareKilometers.SquareMetersPerUnit;
sqMetersPerUnit = AreaUnit.SquareMiles.SquareMetersPerUnit;
sqMetersPerUnit = AreaUnit.SquareYards.SquareMetersPerUnit;
3.5 创建面积单位
try
{
var myFactoryCodeInit = AreaUnit.CreateAreaUnit(109439); // 109439 是平方英里的工厂代码
var myWktUnit = AreaUnit.CreateAreaUnit("HECTARE_AREAUNIT[\"H\",10000.0]");
var myCustomUnit = AreaUnit.CreateAreaUnit("myAreaUnit", 12);
}
catch (ArgumentException)
{
// 在以下场景中,CreateAreaUnit 将抛出 ArgumentException:
// - 如果使用的工厂代码是非面积工厂代码(例如,它对应于度,这是一个角度单位代码)
// - 如果使用的工厂代码无效(例如,它是负数或不对应任何工厂代码)
}