- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有由两个地理点定义的矩形:
1 -> 54.2749558,18.4287748 (lat, lng)
2 -> 54.4472187,18.9512795 (lat, lng)
这两点之间的距离(对角线)为 39 公里(使用 this 算法计算)。现在我需要将对角线加倍:39km * 2 = 78km 并找到新扩展矩形的坐标(其中间与第一个矩形位于同一位置)。
有人可以帮我用 Java 创建该算法吗?
编辑:我的代码使用Mbo的答案:
public static void main(String[] args) {
//example data
double lat1d = 54.2749558;
double lng1d = 18.4287748;
double lat2d = 54.4472187;
double lng2d = 18.9512795;
Coordinate lat1 = Coordinate.fromDegrees(lat1d);
Coordinate lng1 = Coordinate.fromDegrees(lng1d);
Point point1 = Point.at(lat1, lng1);
Coordinate lat2 = Coordinate.fromDegrees(lat2d);
Coordinate lng2 = Coordinate.fromDegrees(lng2d);
Point point2 = Point.at(lat2, lng2);
System.out.println("Point1: " + point1);
System.out.println("Point2: " + point2);
double distance = EarthCalc.gcdDistance(point1, point2); //in meters
System.out.println("Current distance between points 1 and 2: " + distance);
double newDistance = distance * 2;
System.out.println("Needed distance between points 3 and 4: " + newDistance);
double y = Math.sin(lng2d - lng1d) * Math.cos(lat2d);
double x = Math.cos(lat1d) * Math.sin(lat2d) - Math.sin(lat1d) * Math.cos(lat2d) * Math.cos(lng2d - lng1d);
double brng4 = Math.toDegrees(Math.atan2(y, x)); // bearing for calculating point 4
double earthRadiusInMeters = EarthCalc.EARTH_DIAMETER / 2;
double distanceByRadius4 = distance * 1.5 / (earthRadiusInMeters / 2);
double lat4d = Math.asin(Math.sin(lat1d) * Math.cos(distanceByRadius4) +
Math.cos(lat1d) * Math.sin(distanceByRadius4) * Math.cos(brng4));
double lng4d = lng1d + Math.atan2(Math.sin(brng4) * Math.sin(distanceByRadius4) * Math.cos(lat1d), Math.cos(distanceByRadius4) - Math.sin(lat1d) * Math.sin(lat2d));
Point point4 = Point.at(Coordinate.fromDegrees(lat4d), Coordinate.fromDegrees(lng4d));
double brng3 = brng4 + Math.PI; // bearing for calculating point 3
double distanceByRadius3 = distance * 0.5 / (earthRadiusInMeters / 2);
double lat3d = Math.asin(Math.sin(lat1d) * Math.cos(distanceByRadius3) +
Math.cos(lat1d) * Math.sin(distanceByRadius3) * Math.cos(brng3));
double lng3d = lng1d + Math.atan2(Math.sin(brng3) * Math.sin(distanceByRadius3) * Math.cos(lat1d),
Math.cos(distanceByRadius3) - Math.sin(lat1d) * Math.sin(lat2d));
Point point3 = Point.at(Coordinate.fromDegrees(lat3d), Coordinate.fromDegrees(lng3d));
System.out.println("Point3: " + point3);
System.out.println("Point4: " + point4);
double actualDistance = EarthCalc.gcdDistance(point3, point4); //in meters
System.out.println("Actual distance:" + actualDistance);
}
控制台输出:
Point1: Point{latitude=54.2749558, longitude=18.4287748}
Point2: Point{latitude=54.4472187, longitude=18.9512795}
Current distance between points 1 and 2: 38896.62579783285
Needed distance between points 3 and 4: 77793.2515956657
Point3: Point{latitude=-0.8693568850955943, longitude=18.451667950625396}
Point4: Point{latitude=-0.8624187436224934, longitude=18.360085243458784}
Actual distance:10211.570252961072
最佳答案
对于小区域,您可以使用“平坦”近似:
lat3 = lat1 - 0.5*(lat2 - lat1)
lat4 = lat1 + 1.5*(lat2 - lat1)
and similar for longitude
快速检查:
1 -> 54.2749558,18.4287748 (lat, lng)
2 -> 54.4472187,18.9512795 (lat, lng)
dlat = 54.4472187 - 54.2749558 = 0.172
dlon = 18.9512795 - 18.4287748 = 0.553
lat3 = 54.2749558 - 0.086 = 54.189
lon3 = 18.9512795 - 0.276 = 18.675
lat4 = 54.2749558 + 3 * 0.086 = 54.533
lon4 = 18.9512795 + 3 * 0.276 = 19.779
由于我的粗略舍入和球形扭曲,距离计算得出 81.11 公里
为了解释球面几何形状,使用 latlong page 中的公式:
我假设“中间”是大圆弧中心(角之间的中间) - 它与坐标平均值不同
不要忘记以弧度转换坐标值
从第一点获取方位:
y = Math.sin(λ2-λ1) * Math.cos(φ2);
x = Math.cos(φ1)*Math.sin(φ2) - Math.sin(φ1)*Math.cos(φ2)*Math.cos(λ2-λ1);
brng = Math.atan2(y, x).toDegrees();
其中 φ1,λ1 为起点,φ2,λ2 为终点
对于一个新角点 - 给定距起点的距离和方位的目的地点:
φ4 = Math.asin( Math.sin(φ1)*Math.cos(d/R) +
Math.cos(φ1)*Math.sin(d/R)*Math.cos(brng) );
λ4 = λ1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(φ1),
Math.cos(d/R)-Math.sin(φ1)*Math.sin(φ2));
其中 R 是地球半径,d 是所需距离 - 这里1.5 * 39 = 58.5
对于第二个角点 - 相同的目的地点公式,其中 d = 0.5*39 = 19.5
和反向方位 brng+Pi
关于java - 通过对角线加倍来计算新矩形的角(两个地理点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49798418/
我正在使用Mapbox开发 map 应用程序。 我正在使用的方法使用Point(Double,Double) 获取类型不匹配要求:两次发现:两次? val lat = location
我想将 System.out 消息写入另一个 OutputStream,但我仍然想要标准输出。 我找到了类似问题的答案Copy and Redirecting System.err Stream :
我正在尝试为我正在处理的排序找到所有处理器的全局最小值和最大值。我正在尝试使用 MPI_Reduceall int rank, nproc; MPI_Comm_size(MPI_COMM_WORLD,
我想知道从一种可空类型转换为另一种“兼容”可空类型的最佳方式(从更安全和简洁的意义上说)是什么。 具体来说,从十进制转换?加倍?可以使用: public double? ConvertToNullab
我的一个表的文件大小(.MYD 文件)增加了大约 100%。如果我查看数据,就会发现过去几天的每日负载正常。是什么导致文件大小增加? myisamchk 根据用户的建议,我尝试了sudo myisam
我有一个 invoices 表。每张发票都有许多 invoice_items 和 transactions(或者,如果您愿意,也可以是“付款”)。对于每张发票,我想计算已支付金额(即其交易金额的总和)
我需要一个尽可能接近 0 的值。我需要能够除以这个值,但实际上它应该为 0。 Java 是否提供了一种简单的方法来生成仅设置最低有效位的 double ?还是必须自己计算? //编辑:一些背景信息,因
由于 Math.random ()(以及大多数伪随机数生成器,AFAIK)在 [0,1) 中生成数字: function randomInRange(min, max) { return Math
这应该很容易。相信我,我已经为此研究了几个小时。我的查询: SELECT not_piece.pid, part.name AS 'Part Name', SUM(qty_left) AS 'In S
我正在尝试传递类型为 vector > 的变量到函数 F(double ** mat, int m, int n) . F 函数来自另一个库,所以我无法更改它。有人可以给我一些提示吗?谢谢。 最佳答案
我正在尝试读取一个文件,读取它包含的字节数,然后将其四舍五入到最接近的 GB,然后将文件大小加倍。但是,有没有办法读取文件,然后将所有这些东西重新放入同一个文件中? 这是我目前所拥有的,但它创建了一个
我正在尝试传递类型为 vector > 的变量到函数 F(double ** mat, int m, int n) . F 函数来自另一个库,所以我无法更改它。有人可以给我一些提示吗?谢谢。 最佳答案
我想对超大 (200+ MB) Sqlite 文件进行一些测试。我有一些相对较小的文件 (10MB),但我想测试更大的文件。 有没有什么快速的方法/工具可以通过复制表中的数据来增加这些 Sqlite
我有一个 64 位数字,写成两个 32 位未签名的整数:unsigned int[2]。 unsigned int[0] 是 MSB,unsigned int[1] 是 LSB。我如何将它转换为 do
我需要将数量的值传递给库进行评估。 boost units library在 SI 中采用双倍值,因此 boost 单位库在确保该要求方面非常有吸引力。但是,我应该如何将数量转换为双倍值?文档和示例似
如何向 ksoap2 请求添加双重属性? request.addProperty("doubleProperty", 1.0); 网络上没有明确的答案。 最佳答案 为了将 double 值作为请求参数
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我正在尝试从 AngularJS 用 Swing 编写的 REST API 生成 .bin 文件。以下是代码。 var options = { url: 'http://example.com/i
我对这段代码中的特定值集有疑问。 double inputs[] = {0, -546543, 99015, 6750, 825, 2725, 70475, 50950, 42200, 675
我在 ruby on rails 应用程序中尝试为密码生成盐时遇到了 SecureRandom#hex 方法。为什么它会加倍长度参数/坚持返回的字符串长度是偶数? 最佳答案 该方法生成一个 n 字
我是一名优秀的程序员,十分优秀!