두 가지 알려진 점 사이에 좌표를 생성하는 방법
-
23-12-2019 - |
문제
배경 :
운송 경로로 작업하고 Google은 '모양'을 만드는 데 충분할 정도로 경로 점을 훨씬 넓게 제공합니다.이들은 Google지도에서 볼 수있는 버스 / 기차 경로입니다.
내 요구 사항 :
Google의 포인트는 직선을 만들기에 충분합니다.그러나 나는마다, 5 미터, 말하기를 원한다.
문제 :
그래서, 내가 2 점을 가지고 있다고 말하면,
[- 33.8824219918503,151.206686052582] 및 [-33.8815434600467,151.206556440037]
이 두 점을 고려할 수 있습니다. 나는 그 사이의 거리를 계산할 수 있습니다.논쟁을 위해 1km이라고 말하면
우리는 그 두 점 사이에 상상의 직선을 상상할 수 있습니다.
모든 것에 대해 해당 라인에 대한 좌표를 생성하는 방법, 5 미터
해결책
class Numeric
def to_rad
self * Math::PI / 180
end
def to_deg
self * 180 / Math::PI
end
end
include Math
R = 6371.0
def waypoint(φ1, λ1, θ, d)
φ2 = asin( sin(φ1) * cos(d/R) + cos(φ1) * sin(d/R) * cos(θ) )
λ2 = λ1 + atan2( sin(θ) * sin(d/R) * cos(φ1), cos(d/R) - sin(φ1) * sin(φ2) )
λ2 = (λ2 + 3 * Math::PI) % (2 * Math::PI) - Math::PI # normalise to -180..+180°
[φ2, λ2]
end
φ1, λ1 = -33.to_rad, -71.6.to_rad # Valparaíso
φ2, λ2 = 31.4.to_rad, 121.8.to_rad # Shanghai
d = R * acos( sin(φ1) * sin(φ2) + cos(φ1) * cos(φ2) * cos(λ2 - λ1) )
θ = atan2( sin(λ2 - λ1) * cos(φ2), cos(φ1) * sin(φ2) - sin(φ1) * cos(φ2) * cos(λ2 - λ1) )
waypoints = (0..d).step(2000).map { |d| waypoint(φ1, λ1, θ, d) }
markers = waypoints.map { |φ, λ| "#{φ.to_deg},#{λ.to_deg}" }.join("|")
puts "http://maps.googleapis.com/maps/api/staticmap?size=640x320&sensor=false&markers=#{markers}"
.
은 Valparaíso의 웨이 포인트와 2,000km마다 상하이의 웨이 포인트와 함께 Google 정적지도를 생성합니다.
http://maps.googleapis.com/maps/api/staticmap?size=640x320&sensor=false&markers=-33.0,-71.60000000000002|-32.54414813683714,-93.02142653011552|-28.59922979115139,-113.43958859125276|-21.877555679819015,-131.91586675556778|-13.305784544363858,-148.5297601858932|-3.7370081151180683,-163.94988578467394|6.094273692291354,-179.03345538133888|15.493534924596633,165.33401731030006|23.70233917422386,148.3186618914762|29.83806632244171,129.34766276764626
.
다른 팁
단계 1 - 전체 거리 가져 오기
이것은 'HAversine'공식을 사용하여 위대한 원을 계산합니다. 두 점 사이의 거리 - 즉, 가장 짧은 거리 지구의 표면 - '크로스 as-the-crow-fries'거리 포인트 (물론 언덕을 무시하십시오!).
var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var distance = R * c;
.
2 단계 - 여행 백분율을 얻습니다.
이제이 직선에 대한 거리가 있으면 5 미터마다 전체 거리의 백분율을 해결할 수 있습니다.
3 단계 - 위도와 경도의 차이로 이동 한 백분율
시작 위도와 최종 위도의 차이점을 알아보십시오. 이 숫자로 이동 백분율 (소수점)으로 곱하십시오. 그런 다음이 지점의 현재 위도를 찾기 위해 시작 위도에 다시 추가 될 수 있습니다. 경도를 반복하십시오.
다음 해결책은 귀하가 요청한 것이 정확히 일어나지 않지만 귀하의 목적을 위해 충분할 수 있습니다 ...
공식 문서를 확인하십시오 ( https://developers.google.com/maps/documentation/ JavaScript / 참조 interpolate
메소드의 경우.문서에서 : ''원점 사이의 방식이 주어지는 LATLNG와 대상 LATLNG '라는 LATLNG를 반환합니다.'
원래 지점이 100m 떨어져 있고 0.05를 분수로 지정하고 5M마다 그 줄을 따라 LAT / LNG를 반환합니다.