Рассчитать расстояние по полилинии дороги между 2 лат / лон - PullRequest
1 голос
/ 30 марта 2019

Это не расстояние, как ворона летит.

Я ищу такой API:

distanceMiles = CalculateMilesBetweenPointsAlongRoad (LatLon1, LatLon2, RoadPolyline)

У меня есть дорога, представленная в виде ломаной линии.

Когда машина едет по этой дороге, я ловлю широту / долготу. Я хочу рассчитать расстояние, пройденное транспортным средством между каждым сообщенным LatLon.

Из-за скорости приема данных я хотел бы сделать это без пространственных запросов, но я буду в порядке, если единственный способ - сохранить дорожную полилинию в BigQuery или PostGIS и постоянно выполнять запросы к ней.

1 Ответ

3 голосов
/ 30 марта 2019

Когда машина едет по дороге, я ловлю широту / долготу.Я хочу рассчитать расстояние, пройденное транспортным средством между каждым сообщенным LatLon.

Позвольте мне подражать вашему сценарию использования со сценарием вычисления расстояния, которое было сделано ураганом Мария в 2017 году

Ниже запрос «готовит» данные для этого (BigQuery Standard SQL):

#standardSQL
WITH points AS (
    SELECT ROW_NUMBER() OVER(ORDER BY iso_time) pos,
        ST_GEOGPOINT(longitude, latitude) AS point
    FROM `bigquery-public-data.noaa_hurricanes.hurricanes`
    WHERE name LIKE '%MARIA%' AND season = '2017'
        AND ST_DWITHIN(ST_GEOGFROMTEXT('POLYGON((-179 26, -179 48, -10 48, -10 26, -100 -10.1, -179 26))'), ST_GEOGPOINT(longitude, latitude), 10)
), lines AS (
    SELECT pos, ST_MAKELINE(LAG(point) OVER(ORDER BY pos), point) line
    FROM points
) 
SELECT pos, line
FROM lines
WHERE pos > 1

выше можно визуализировать как

enter image description here

Теперь ниже вычисляется расстояние, которое ураган "преодолел"

#standardSQL
WITH points AS (
  SELECT ROW_NUMBER() OVER(ORDER BY iso_time) pos,
    ST_GEOGPOINT(longitude, latitude) AS point
  FROM `bigquery-public-data.noaa_hurricanes.hurricanes`
  WHERE name LIKE '%MARIA%' AND season = '2017'
    AND ST_DWITHIN(ST_GEOGFROMTEXT('POLYGON((-179 26, -179 48, -10 48, -10 26, -100 -10.1, -179 26))'), ST_GEOGPOINT(longitude, latitude), 10)
), lines AS (
  SELECT pos, ST_MAKELINE(LAG(point) OVER(ORDER BY pos), point) line
  FROM points
) 
SELECT SUM(ST_LENGTH(line)) path_length
FROM lines
WHERE pos > 1

enter image description here

Примечание: ST_LENGTH(geography_expression) возвращает общую длину в метрах линий на входе GEOGRAPHY

Вы можете прочитать больше о ST_LENGTH здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...