Как создать буферизованную строку LineString с шириной, определенной в метрах, при использовании GEOSwift?

Я надеюсь найти способ, используя GEOSwift, взять серию пользовательских LatLng, построить линейную строку и буферизовать ее так, чтобы она всегда была шириной 30 метров независимо от местоположения пользователя. Я чувствую, что должен быть более легкий путь, чем путь, по которому я иду, и любая помощь будет оценена.

Фон:

Из того, что я могу сказать, параметр ширины буферных функций в настоящее время определяется в десятичных градусах, поскольку моя система координат - EPSG 4326, что затрудняет вычисление ширины в метрах. Я могу получить приблизительную оценку метров на десятичный градус как для долготы, так и для широты с помощью формулы Хаверсайна.

У меня проблема в том, что ряд точек может двигаться как в продольном, так и в продольном направлении. Таким образом, ширина буфера, которая мне нужна в этих случаях, лежит где-то между ThirtyMetersInLatDegrees и ThirtyMetersInLngDegrees. И в этом случае ширина, передаваемая в буферную функцию, становится странным приближением / усреднением общего продольного и широтного перемещения пользователя по всей линейке, связанной с ThirtyMetersInLngDegrees и ThirtyMetersInLatDegrees.

т.е. предполагая, что ThirtyMetersInLngDegrees является максимальным:

ThirtyMetersInLatDegrees <= bufferWidth <= ThirtyMetersInLngDegrees

Как я могу лучше достичь этого?

Вот как я рассчитываю метры на один десятичный градус:

//Earth’s radius
let R=6378137.0

let deviceLatitude = 37.535997
let OneMeterInLatDegrees = 1/R * (180/Double.pi)
let OneMeterInLngDegrees = 1/(R*cos(Double.pi*deviceLatitude/180)) * (180/Double.pi)
let ThirtyMetersInLatDegrees = 30 * latDegreesPerMeter
let ThirtyMetersInLngDegrees = 30 * lngDegreesPerMeter

0 ответов

Другие вопросы по тегам