2014-01-22 5 views
7

Я пытаюсь получить минимальное расстояние между данной точкой и побережьем. Мой пример расстояние от Мадрида до побережья:Расчет минимального расстояния между точкой и побережьем

library(rgeos) 
library(maptools) 
coast <- readShapeLines("Natural_Earth_quick_start/10m_physical/ne_10m_coastline.shp") 
MAD = readWKT("POINT(-3.716667 40.383333)") 
gDistance(MAD,coast) 
[1] 3.021808 

У меня возникли проблемы с пониманием того, что gDistance() возвращается. Документы говорят, что это в единицах проекции. Означает ли это, что он находится в латах? Как я могу преобразовать это в километры?

+0

Можете ли вы предоставить ссылку на свою карту? В начале введите 'proj4string (coast)', чтобы увидеть, что такое проекция. Если есть строка '+ units = ', то это единицы. – jlhoward

+1

Карта, которую я использую, - это береговая линия от http://www.naturalearthdata.com/downloads/10m-physical-vectors/. 'proj4string (coast)' возвращает 'NA' – user525602

+0

Вы посмотрели определение расстояния Хаусдорфа, связанного со страницы справки ?. Я понимаю, что этот ответ находится в «градусах», но я вовсе не убежден, что имеет смысл, поскольку количество километров в «градусе» колеблется от примерно 100 на экваторе до нуля на полюсах –

ответ

10

gDistance(...) возвращает минимальное декартовое (евклидово) расстояние между точкой и набором функций, представленными в качестве аргументов. Поскольку ваша карта находится в координатах long/lat, вы получаете расстояние в градусах, например.

д = SQRT {(длинный - длинные) + (лат - лат) }

, где долго и лат находятся в десятичной степени. Как уже отмечалось, это не значит, что переход на плоское расстояние (скажем, км) зависит от того, где вы находитесь. Поэтому нам необходимо преобразовать ваши данные в CRS, который является приблизительно плоским в интересующей области. Оказывается, что соответствующий CRS для Испании - EPSG-2062. Строка проекции для EPSG-2062 является:

+proj=lcc +lat_1=40 +lat_0=40 +lon_0=0 +k_0=0.9988085293 +x_0=600000 +y_0=600000 +a=6378298.3 +b=6356657.142669561 +pm=madrid +units=m +no_defs 

который имеет +units=m (м). Поэтому нам нужно перепрограммировать как точку (MAD), так и границы в EPSG-2062.

library(rgeos) 
library(maptools) 

epsg.2062 <- "+proj=lcc +lat_1=40 +lat_0=40 +lon_0=0 +k_0=0.9988085293 +x_0=600000 +y_0=600000 +a=6378298.3 +b=6356657.142669561 +pm=madrid +units=m +no_defs" 
wgs.84 <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" 

coast <- readShapeLines("ne_10m_coastline",CRS(wgs.84)) 
MAD <- readWKT("POINT(-3.716667 40.383333)",p4s=CRS(wgs.84)) 
gDistance(MAD,coast)   # WGS-84 (long/lat) projection, units in "degrees" 
# [1] 3.021808 

coast.proj <- spTransform(coast,CRS(epsg.2062)) 
MAD.proj <- spTransform(MAD,CRS(epsg.2062)) 
gDistance(MAD.proj,coast.proj) #EPSG-2062 projection, units are in meters. 
# [1] 305171.2 

Таким образом, минимальное расстояние ~ 305.2km.

Наконец, обратите внимание, что ваш файл береговой линии имеет все береговые линии мира, так что это минимальное расстояние до около береговой линии, не обязательно испанского побережья (хотя в этом случае это оказывается на севере побережье Испании). Если бы ваш ориентир был очень близок к границе с Португалией, ближайшая прибрежная точка была бы на западном побережье Португалии.

+0

Спасибо !, что это именно то, что я хотел. Откуда вы знаете, что это северное побережье? – user525602

+0

Короткий ответ заключается в том, что я посмотрел карту, но, глядя снова, Мадрид мог быть ближе к средиземноморскому побережью недалеко от Кастельона. Существует способ идентифицировать координаты ближайшей точки, но это сложно. Если вам нужно знать, что вы должны опубликовать отдельный вопрос. – jlhoward

+1

Это выглядит великолепно, но какую проекцию я должен использовать при расчете расстояния точек (в км) до ближайшего берега в глобальном масштабе? У меня есть ~ 250 баллов! –

Смежные вопросы