我需要计算两点之间的距离(给定纬度和经度)。我在 C# 中实现了标准半正矢公式
private double toRadian(double val)
{
return (Math.PI / 180) *
}
public double Distance(Position pos1, Position pos2,DistanceType type)
{
double R = (type == DistanceType.Miles) ? 3960 : 6378137; // 6318137 in meters
double dLat = toRadian(pos2.Latitude - pos1.Latitude);
double dLon = toRadian(pos2.Longitude - pos2.Longitude);
double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
Math.Cos(this.toRadian(pos1.Latitude)) * Math.Cos(this.toRadian(pos2.Latitude)) *
Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
double …Run Code Online (Sandbox Code Playgroud) 为什么Haversine公式会返回很远的距离?根据我通过的值,距离不应超过1或2公里.但它返回8,104公里.
我知道这是PHP经常出现的问题.
感谢这里的代码片段:
function haversineGreatCircleDistance(
$latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371)
{
// convert from degrees to radians
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);
$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;
$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
return $angle * $earthRadius;
}
Run Code Online (Sandbox Code Playgroud) 我正在我的 CNN(python 2.7.14,tensorflow 1.14.0)中实现一个半正弦损失函数。我正在寻找将度数转换为弧度的 tf 调用。有这样的api吗?在 tensorflow 文档中找不到这个。
我正在尝试使用 R 查找两点之间的距离。虽然我已经看到了其他答案(从数据框到特定位置查找最近的城市),但我想使用特定的公式来计算以英里为单位的距离。在另一个网站(https://andrew.hedges.name/experiments/haversine/)上,我发现 Java 中的这段代码在 GUI 中给出了正确的距离:
dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
c = 2 * atan2( sqrt(a), sqrt(1-a) )
d = 3961 * c
Run Code Online (Sandbox Code Playgroud)
然后我将其转换为 R 中的函数:
geo_distance <- function(lon2, lon1, lat2, lat1){
dlon <- lon2 - lon1
dlat <- lat2 - lat1
a <- (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
c <- 2 * atan2(sqrt(a), sqrt(1-a))
d <- 3961 …Run Code Online (Sandbox Code Playgroud) 我想用Haversine公式计算两个地方之间的距离.实际上我有两个地方的纬度和经度值.现在我想用Haversine公式计算那些地方之间的距离.
对于Eg:
First Place:
"lat" : 12.97159870,
"lng" : -77.59456270
Second Place:
"lat" : 9.915996999999999,
"lng" : -78.1218470
},
Run Code Online (Sandbox Code Playgroud)
现在我想用Haversine Formula计算距离.
请帮帮我.谢谢!
我ST_Distance_Spheroid在 PostgreSQL(使用 Postgis)中使用来计算沃金和爱丁堡之间的距离,如下所示:
CREATE TABLE pointsTable (
id serial NOT NULL,
name varchar(255) NOT NULL,
location Point NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO pointsTable (name, location) VALUES
( 'Woking', '(51.3168, -0.56)' ),
( 'Edinburgh', '(55.9533, -3.1883)' );
SELECT ST_Distance_Spheroid(geometry(a.location), geometry(b.location), 'SPHEROID["WGS 84",6378137,298.257223563]')
FROM pointsTable a, pointsTable b
WHERE a.id=1 AND b.id=2;
Run Code Online (Sandbox Code Playgroud)
我得到了 592 公里(592,053.100454442 米)的结果。
不幸的是,当我使用网络上的各种来源进行相同的计算时,我始终在 543 公里附近,相差 8.2%。
幸运的是,第三个消息来源澄清说他们使用的是半正弦公式。我不确定其他两个来源。
我在查询中做错了什么还是因为使用的公式不同?如果是这样,哪个计算最接近乌鸦可以飞行的最短距离,保持恒定的高度?
我有下面的代码用于计算机场列表之间的半正矢距离,但它始终返回错误的值。例如,在 ORD(芝加哥)和 JFK(纽约)上运行以下代码,haversine (head $ allAirports) (last $ allAirports)仅
92.16479615931107当 ORD 和 JFK 之间的实际距离约为 827 英里时才会返回。知道我在计算中做错了什么吗?
type Location = (Double, Double)
data Airport = Airport {
name :: String,
location :: Location
} deriving (Eq)
allAirports :: [Airport]
allAirports = [
Airport { name="ORD", location=(41.9786,-87.9048)},
Airport { name="JFK", location=(40.64505923593942, -73.777106518636)}]
haversine :: Airport -> Airport -> Double
haversine (Airport _ (x1,y1)) (Airport _ (x2,y2)) = radius * c
where radius = 3959.87433
to_rad :: Double -> Double …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Haversine formula 维基百科上给出的这个实现进行试验,但这个公式没有给出预期的结果。
public class Haversine {
public static final double R = 6372.8; // In kilometers
public static double haversine(double lat1, double lon1, double lat2, double lon2) {
double dLat = Math.toRadians(lat2 - lat1);
double dLon = Math.toRadians(lon2 - lon1);
lat1 = Math.toRadians(lat1);
lat2 = Math.toRadians(lat2);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
double c = 2 * Math.asin(Math.sqrt(a));
return …Run Code Online (Sandbox Code Playgroud)