Как генерировать координаты между двумя известными точками

StackOverflow https://stackoverflow.com//questions/22063201

Вопрос

<Сильный> Фон:

Я работаю с транспортными маршрутами, и Google предоставляет баллы маршрута достаточно далеко друг от друга, чтобы создать «фигуры».Это маршруты автобуса / поезда, которые вы видите в Google Maps.

<Сильные> Мое требование:

Точки Google достаточно далеко, чтобы создать прямые линии.Однако я хочу каждый, скажем, 5 метров.

<Сильная> проблема:

Так, скажем, у меня есть два очка [lat, длинные]:

[- 33.8824219918503,1519918503,15192206686052582] А [-33.8815434600467151.20656440037]

Учитывая эти две точки, я могу рассчитать расстояние между ними.Сказать, что это 1 км ради аргумента.

Итак, мы можем представить воображаемую прямую прямую между этими двумя точками.

Как мне генерировать координаты для этой воображаемой линии для каждого, скажем, 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}"
.

генерирует ссылку Google Static Maps с путевыми точками от Valparaíso в Шанхай каждые 2000 км:

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 - Получите общее расстояние

Комплексный ответ можно найти здесь: http://www.movable-type .co.uk / Scripts / latlong.html

tl; dr:

Это использует формулу «haversine» для расчета большого круга расстояние между двумя точками - то есть самое короткое расстояние над поверхность земли - давая расстояние «как-волна» между Точки (игнорируя любые холмы, конечно!).

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. '

Так что, если вы знаете, что ваши первоначальные точки, скажем, 100 м друг от друга, и вы указываете 0,05 в качестве фракции, метод вернет лат / СПГ вдоль этой линии на каждые 5 м.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top