65.9K
CodeProject 正在变化。 阅读更多。
Home

Java GIS 坐标类

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.40/5 (3投票s)

2004年6月24日

CPOL

3分钟阅读

viewsIcon

54226

downloadIcon

480

这是一个 JAVA 类,可以在您的程序中表示 GIS 坐标,并允许您根据给定的距离和方向“移动”或转换坐标。

引言

本文介绍 GISCoordinate.java - 一个类,允许您以十进制度数 (例如 38.4443, 122.33433)、分度数 (33 44 22E, 122 33 44N) 或弧度度数在您的 JAVA 代码中表示 GIS 坐标。 此外,您可以使用此类来操作坐标,通过给定英尺为单位的距离和行进方向来将其在地球上移动。 然后,您可以提取行进后计算出的新坐标。

背景

在我的一个应用程序中,我必须能够将位图地图上绘制的数据导出到 GIS 软件。 我意识到我需要一些类来表示 GIS 坐标并允许我操作(移动)它。 这里的复杂之处在于,要使用现有坐标、行进方向和行进距离生成新坐标,需要考虑到地球是圆的,而不是平的,并且它的圆形度没有由任何标准几何形状定义。 因此,您可以为此计算使用各种公式,具体取决于您认为地球的形状是什么。 通用方法包括

  • 球体
  • WGS84/NAD83/GRS80
  • Clarke (1866)/NAD27
  • 国际
  • 克拉索夫斯基
  • 贝塞尔 (1841)
  • WGS72
  • WGS66
  • FAI 球体

此处提供的类允许您

根据以度分格式或十进制度数(例如 37:55:15N , 122:20:59W 或它们的十进制等效值)给出的一组坐标来构造自身。

将坐标移动任意英尺数并向任何方向(0-360 度)移动,并使新的纬度和经度自动更新到新位置。 移动的计算将使用从上述 9 种方法中选择的方法来完成。

以十进制度数或度分秒打印纬度和经度。

致谢:我的代码基于 Ed Williams 提供的 JavaScript 代码:http://williams.best.vwh.net/gccalc.htm,当然,必须在 Java 中完全重写并包装在一个漂亮的面向对象的包装器中。

Using the Code

GISCoordinate.java 确实有一个 main 方法,用于举例说明该类的用法。 基本上,这里有一些指针

您通常按如下方式实例化该类

GISCoordinate g = new GISCoordinate("37:55:15","N","122:20:59","W");

这为您提供了一个表示 GIS 坐标的对象

  • 经度:北纬 37 度 55 分 15 秒
  • 纬度:西经 122 度 20 分 59 秒

要查看它在十进制度数中的表示

g.printDEGDEC(System.out);

然后,您可以将坐标移动到任何方向和任何距离

double movedist=2640;//5280.0;
double movedeg=167; 
System.out.println("Moving "+movedist+" Feet, in a direction of "+movedeg+" degrees...");
g.move(movedist, movedeg, NAD83);

请注意,movedist 是要移动的距离(以英尺为单位)(在本例中为半英里),而 movedeg 是移动的角度(从 0-360,因此这将是东南方向)。 另请注意,选择了 NAD83 方法,该方法假定地球具有某种形状。 当然,也可以使用上述 9 种方法中的另一种。 查看类实现开始时声明的常量,以查看您可以选择的不同变量的名称。

可以再次打印新位置

g.printDEGDEC(System.out);

演示程序包含在实际类中。 要编译和运行演示程序

  1. 将 zip 文件(附加到本文)内容解压到 c:\temp 中,同时保留 zip 目录结构。
  2. 打开 cmd 并 cd 到 temp 中。 然后在命令行上发出
     javac com\ha\common\gis\*.java 
  3. 然后,要运行演示,请在命令行上发出
    java -classpath c:\temp\ com.ha.common.gis.GISCoordinate

要在您的代码中使用此类,您可以修改包名称以适合您的包方案,并按照 main() 方法中的示例调用它。

历史

  • 初始版本:2004 年 6 月 24 日
© . All rights reserved.