0

我有个问题。我正在尝试编写一个JAVA代码,在给定的方位 (lat,lon) 中, 我需要获取形成扇区的所有点的速度(如图 (x1,y1) 、 (x2,y2) 和点列表中)它在轴承给出的方向上形成一个弧线(我对轴承的了解非常有限)。

在此处输入图像描述

我的第一件事是根据具有硬编码距离和角度的方向来实现扇区。(即固定值说d=5kmangle= 60 deg。)

下一步基于我想要距离的速度d,并angled=func(speed)angle=一样计算,func(speed)但这将在稍后进行。

由于方位是根据度数给出的,我不知道如何计算方向。我在想什么如果我能够将方位转换为同一方向的单位矢量。那么我认为我们可以绘制该部门。

如果我的理论/解释有误,请纠正我。请我需要帮助的人......

更多细节:

我正在做一个小项目,同时通过手机上的谷歌地图进行跟踪(lat,lon) - current position of userbearing - in the direction in which I am headed并且speed - what speed i am travelling

距离和角度与速度的关系:

如果我以更快的速度行驶,则d应该更多并且angle应该更少(弧线会更窄)

如果我以较低的速度行驶,那么d应该更小并且`角度应该更大(弧线会更宽)

如果我是静止的,速度是0,然后我会围绕我的电流画一个圆圈,然后在我周围(lat,lon)找到我的 POI。

一旦我得到这个扇区,我将使用 Elastic 搜索(它提供一些 func(),如附近搜索和多边形搜索)在我跟踪时获取沿途的所有兴趣点

最终,当我开车时,我想向用户展示他一路走来的 POI 是什么。(我们不知道用户的目的地)

更新

public class Test {

    // N is the number of points on the arc
    // e.g. const int N = 15;
    private static final int N = 10;

    public static void main(String[] args){

        final double deg2Rad = Math.PI / 180.0; //degree to Radian
        final double Rad2deg = 180.0 / Math.PI; //Radian to degree
        double bearing =  90; //direction
        double angle = 60; //sector angle   
        double R = 6371.0; //Radius of earth

        double lat = 12.926428 * deg2Rad;
        double lon = 77.677705 * deg2Rad;

        double d = 5; 

        Geopoint[] array = new Geopoint[N];

        double A = bearing - angle * 0.5;    // starting angle / bearing
        double dA = angle / (double)(N - 1); // angle step between adjacent points

        /* convert lat, lon to cartesian here! */
        double  x = R * Math.cos(lat) * Math.cos(lon);
        System.out.println(x);
        double  y = R * Math.cos(lat) * Math.sin(lon);
        System.out.println(y);
        double  z = R * Math.sin(lat);
        System.out.println(z);


        for (int i = 0; i < N; i++, A += dA)
        {
          double c = Math.cos(A * deg2Rad), 
                 s = Math.sin(A * deg2Rad);

          System.out.println( "C : " + c);
          System.out.println( "S : " + s);

          double x1 = (x + d * c) ;

          double y1 = (y + d * s) ;

          //Convert back to Geopoint
          lat = Math.asin(z / R) * Rad2deg;
          lon = Math.atan2(y1, x1) * Rad2deg;

          array[i] = new Geopoint(lon , lat );
        }

        // return array 
        for ( int i = 0; i < array.length; i++ )
            System.out.println("points," + i + "," + array[i]); 
    }

}

对于上面的代码,我得到低于输出

输出

points,0,{ "lon":130.56759538189806, "lat":20.62976857973366, "geoadress":"null" }
points,1,{ "lon":130.56753333442796, "lat":20.62976857973366, "geoadress":"null" }
points,2,{ "lon":130.56747144031073, "lat":20.62976857973366, "geoadress":"null" }
points,3,{ "lon":130.56740969980146, "lat":20.62976857973366, "geoadress":"null" }
points,4,{ "lon":130.5673481131545, "lat":20.62976857973366, "geoadress":"null" }
points,5,{ "lon":130.5672866806237, "lat":20.62976857973366, "geoadress":"null" }
points,6,{ "lon":130.5672254024622, "lat":20.62976857973366, "geoadress":"null" }
points,7,{ "lon":130.5671642789225, "lat":20.62976857973366, "geoadress":"null" }
points,8,{ "lon":130.5671033102564, "lat":20.62976857973366, "geoadress":"null" }
points,9,{ "lon":130.56704249671517, "lat":20.62976857973366, "geoadress":"null" }

但是这个输出是错误的。我不知道我哪里出错了。

输出

更改为弧度后,这是我的结果latlon

points,0,12.926428,77.677705
points,1,12.926428,77.6917252889466
points,2,12.926428,77.68652371253442
points,3,12.926428,77.68120259629767
points,4,12.926428,77.67583406750569
points,5,12.926428,77.67049090073982
points,6,12.926428,77.6652455243131
points,7,12.926428,77.6601690315512
points,8,12.926428,77.65533021080672
points,9,12.926428,77.65079460778875
points,10,12.926428,77.64662363329005

因为我是lat = Math.asin(z / R) * Rad2deg;从笛卡尔转换过来的,所以我得到了所有相同的结果。我不知道如何解决这个问题。

结果

基于iant代码

在此处输入图像描述

结果_1#

我已经计算了(lat,lon)到弧上每个点的距离。它应该导致相同的距离。iant检查结果距离略有变化。

type,id,lat,lon points,1,12.926428,77.677705 Distance in mtrs : 0.0 points,2,12.92657150782396,77.67778916970093 Distance in mtrs : 9.971162660481445 points,3,12.926578367173896,77.67778862221844 Distance in mtrs : 9.971162660481445 points,4,12.926585180719618,77.67778804926368 Distance in mtrs : 9.971162660481445 points,5,12.926591946385617,77.67778745101116 Distance in mtrs : 9.97070966260917 points,6,12.92659866211097,77.67778682764309 Distance in mtrs : 9.971162660481445 points,7,12.926605325849975,77.6777861793494 Distance in mtrs : 9.971162660481445 points,8,12.926611935572756,77.67778550632754 Distance in mtrs : 9.97070966260917 points,9,12.926618489265902,77.67778480878253 Distance in mtrs : 9.97070966260917 points,10,12.92662498493306,77.67778408692685 Distance in mtrs : 9.971162660481445 points,11,12.926631420595564,77.67778334098041 Distance in mtrs : 9.97070966260917 points,12,12.926637794293018,77.67778257117044 Distance in mtrs : 9.97070966260917 points,13,12.926644104083913,77.67778177773138 Distance in mtrs : 9.97070966260917 points,14,12.9266503480462,77.67778096090498 Distance in mtrs : 9.97070966260917 points,15,12.926656524277885,77.67778012094006 Distance in mtrs : 9.970256644154967 points,16,12.926662630897608,77.67777925809244 Distance in mtrs : 9.970256644154967 points,17,12.926668666045215,77.67777837262499 Distance in mtrs : 9.97070966260917 points,18,12.926674627882324,77.67777746480742 Distance in mtrs : 9.97070966260917 points,19,12.92668051459289,77.67777653491626 Distance in mtrs : 9.970256644154967 points,20,12.926686324383741,77.6777755832348 Distance in mtrs : 9.970256644154967 points,21,12.926692055485155,77.67777461005294 Distance in mtrs : 9.970256644154967 points,22,12.926428,77.677705 Distance in mtrs : 0.0

距离计算

public static double distanceOf(Geopoint a, Geopoint b) {
    if (a.isValid() && b.isValid()) {
      double distFactor = Math.acos(Math.sin(Math.toRadians(a.getLat())) * Math.sin(Math.toRadians(b.getLat()))
          + Math.cos(Math.toRadians(a.getLat())) * Math.cos(Math.toRadians(b.getLat()))
              * Math.cos(Math.toRadians(b.getLon()) - Math.toRadians(a.getLon())));
      return 6378.388 * distFactor;
    }
    return -1;
  }
4

3 回答 3

0

本周早些时候我回答了一个非常相似的问题- GeoTools提供了创建满足这些要求的弧所需的所有工具 - GeodeticCalculator允许您指定起点、方位角和距离,并将返回目标点。使用它很容易创建任何距离和宽度的弧。

完整的代码在这里解决了另一个问题。您需要根据需要参数化宽度(并且可能是弧中的步数)。

编辑

这确实产生了一个弧:

POLYGON ((12.926428 77.677705, 12.926571507823445 77.67778916970063, 12.926578367173352 77.67778862221815, 12.926585180719048 77.67778804926338, 12.926591946385022 77.67778745101086, 12.926598662110349 77.67778682764279, 12.926605325849323 77.6777861793491, 12.926611935572092 77.67778550632724, 12.926618489265206 77.67778480878223, 12.926624984932337 77.67778408692658, 12.926631420594818 77.67778334098014, 12.926637794292239 77.67778257117014, 12.926644104083113 77.67778177773111, 12.926650348045378 77.67778096090471, 12.926656524277035 77.67778012093977, 12.926662630896734 77.67777925809216 , 12.926668666044314 77.67777837262472, 12.926674627881402 77.67777746480715, 12.926680514591945 77.67777653491602, 12.92668632438278 77.67777558323456, 12.926692055484166 77.67777461005268, 12.926428 77.677705))

这仅取决于您如何看待它-遥远的北方(您在斯瓦尔巴群岛工作?)由于地球的曲率,事情看起来很奇怪,因此在像 Plate Carree (WGS84) 这样的平面投影中,它看起来不像弧。

EPSG 中的多边形:4326 (WGS84)

但在等距投影(旨在保持距离看起来正确)中,它是一个弧。

EPSG 中的多边形:102016(极方位角等距)

当然,如果你在印度,那么在 EPSG:4326 中看起来不错。

于 2016-08-06T09:12:23.567 回答
0

当您说要绘制弧线时,我假设您的意思是使用 Java Swing。如果是这种情况,那么 API 已经为您做了很多工作。例如,Arc2D.Float该类有一个构造函数(有关详细信息,请参阅javadoc),它允许您定义要绘制的弧的位置和范围。, x, y,参数将根据原点的位置和距离/半径进行设置w。和参数h将分别设置为和。如果您希望它看起来像您的问题中的图表,则争论将是。startextentbearing - angle / 2angletypeArc2D.PIE

一旦你创建了,Arc2D你可以使用Graphics2D.draw.

我不明白您将距离和角度计算为速度的函数是什么意思。我认为您还需要一个时间参数来计算距离,并且不可能从您的问题中看出速度和角度之间的关系应该是什么。

于 2016-08-05T06:38:31.610 回答
0
const double deg2Rad = Math.PI / 180.0;

// N is the number of points you want on the arc
// If you don't want to pass this, then set it to constant
// e.g. const int N = 15;

Point[] array = new Point[N];
double A = bearing - angle * 0.5;    // starting angle / bearing
double dA = angle / (double)(N - 1); // angle step between adjacent points

double x, y = /* convert lat, lon to cartesian here! */

for (int i = 0; i < N; i++, A += dA)
{
  double c = Math.cos(A * deg2Rad), 
         s = Math.sin(A * deg2Rad);
  array[i] = new Point(x + d * c, y + d * s);
}

// return array
于 2016-08-05T08:59:11.920 回答