2013-09-05 65 views
11

Tôi đã tìm thấy một ví dụ khá đơn giản về cách thực hiện điều này nhưng tôi không thể làm cho nó hoạt động với tôi. Tôi khá mới đối với RChuyển đổi vĩ độ và kinh độ thành UTM

library(rgdal) 
xy <- cbind(c(118, 119), c(10, 50)) 
project(xy, "+proj=utm +zone=51 ellps=WGS84") 
      [,1] [,2] 
[1,] -48636.65 1109577 
[2,] 213372.05 5546301 

Nhưng đây là số ví dụ. Tôi có hàng ngàn tọa độ tôi phải chuyển đổi và tôi không thể tìm ra cách để đưa chúng từ bảng của tôi vào tập lệnh này

Tập dữ liệu của tôi có 3 cột, ID, X và Y. phương trình? Tôi đã bị kẹt trong tuần này

+0

Nó sẽ được khó khăn để giúp bạn nếu bạn không cung cấp cho chúng tôi một số những con số mà ** không ** làm việc (cộng với khả năng một số mô tả về định dạng trong chúng được lưu trữ). Ngoài ra, bạn có biết rằng tất cả các tọa độ dài của bạn nằm trong một vùng UTM không? –

+0

Cũng không nhiều đến mức các con số không hoạt động vì Im không đưa vào các con số. Tôi cần kịch bản để đọc nó từ một bảng của hàng ngàn tọa độ. Tôi chỉ không biết làm thế nào để làm điều đó. dd <- read.csv (tệp.chọn(), header = T) X <- dd [ "X"] Y <- dd [ "Y"] xy <- cbind (c (X), c (Y)) dự án (xy, "+ Proj = utm + khu = 51 ellps = WGS84") Thậm chí chắc chắn nếu phương trình có ý nghĩa nhưng nó không chạy. "xy không phải là số" Ngoài ra tôi không biết liệu tất cả tọa độ của tôi có nằm trong một vùng UTM hay không. Tôi ghét nghe như một thằng ngốc nhưng điều này là mới đối với tôi nhưng tôi không biết điều đó có nghĩa là gì – Colin

+0

Loại bảng nào? (Nó được lưu trữ trong một tập tin văn bản? Một csv? Một cơ sở dữ liệu quan hệ? Một tập tin Excel? Vv vv) Có vẻ như bạn đang thực sự vào thời điểm này hỏi làm thế nào để đọc dữ liệu vào R. Trong trường hợp đó, hãy thử sử dụng Google hoặc tìm kiếm trong thanh tìm kiếm SO ở phía trên bên phải và sau đó hỏi lại nếu bạn không thể tìm ra. –

Trả lời

4

Trong câu hỏi của bạn, bạn không rõ liệu bạn đã đọc trong tập dữ liệu của mình thành một data.frame hay ma trận. Vì vậy, tôi cho rằng trong những điều sau đây bạn có dữ liệu bạn đặt trong một tập tin văn bản:

# read in data 
dataset = read.table("dataset.txt", header=T) 

# ... or use example data 
dataset = read.table(text="ID X Y 
1 118 10 
2 119 50 
3 100 12 
4 101 12", header=T, sep=" ") 

# create a matrix from columns X & Y and use project as in the question 
project(as.matrix(dataset[,c("X","Y")]), "+proj=utm +zone=51 ellps=WGS84") 
#    [,1] [,2] 
# [1,] -48636.65 1109577 
# [2,] 213372.05 5546301 
# ... 

Cập nhật:

Các ý kiến ​​cho rằng vấn đề xuất phát từ áp dụng project() để data.frame. project() không hoạt động trên data.frames vì ​​nó kiểm tra is.numeric(). Do đó, bạn cần chuyển đổi dữ liệu thành ma trận như trong ví dụ trên. Nếu bạn muốn dính vào mã của bạn có sử dụng cbind() bạn phải làm như sau:

X <- dd[,"X"] 
Y <- dd[,"Y"] 
xy <- cbind(X,Y) 

Sự khác biệt giữa dd["X"]dd[,"X"] là sau này sẽ không quay trở lại một data.frame và kết quả là cbind() sẽ mang lại một ma trận và không phải là data.frame.

+2

Cảm ơn bạn như thế nào. Điều này dường như đã tạo ra một cái gì đó mà là một cứu trợ! Sản lượng tính bằng mét? Hầu hết tọa độ của tôi bây giờ trông giống như -9596387 -5670257, -9597204 -5666367, v.v. Điều đó có đúng không? Một số người đã đề cập đến các khu vực UTM. Từ google tôi đề nghị dường như được lan truyền trên 39 l, 39 K và 38 k nếu điều đó có ý nghĩa. Điều đó phải được đưa vào tài khoản trong kịch bản. Như tôi đã nói, tôi chỉ sao chép một ví dụ tôi tìm thấy trực tuyến. Im xin lỗi nếu tôi âm thanh như một thằng ngốc, im chỉ cố gắng để có được một nắm bắt về điều này. Cảm ơn một lần nữa – Colin

18

Để đảm bảo rằng siêu dữ liệu chiếu phù hợp ở mọi bước được liên kết với tọa độ, tôi khuyên bạn nên chuyển đổi điểm thành đối tượng SpatialPointsDataFrame càng sớm càng tốt.

Xem ?"SpatialPointsDataFrame-class" để biết thêm về cách chuyển đổi dữ liệu đơn giản.frames hoặc ma trận sang SpatialPointsDataFrame đối tượng.

library(sp) 
library(rgdal) 

xy <- data.frame(ID = 1:2, X = c(118, 119), Y = c(10, 50)) 
coordinates(xy) <- c("X", "Y") 
proj4string(xy) <- CRS("+proj=longlat +datum=WGS84") ## for example 

res <- spTransform(xy, CRS("+proj=utm +zone=51 ellps=WGS84")) 
res 
#   coordinates ID 
# 1 (-48636.65, 1109577) 1 
# 2 (213372, 5546301) 2 

## For a SpatialPoints object rather than a SpatialPointsDataFrame, just do: 
as(res, "SpatialPoints") 
# SpatialPoints: 
#    x  y 
# [1,] -48636.65 1109577 
# [2,] 213372.05 5546301 
# Coordinate Reference System (CRS) arguments: +proj=utm +zone=51 
# +ellps=WGS84 
+0

Biến "SP" trong cuộc gọi spTransform() là gì? Nếu tôi thay đổi thành "xy", tôi sẽ không nhận được kết quả tương tự như được hiển thị bên dưới cuộc gọi đó. – stackoverflowuser2010

+0

@ stackoverflowuser2010 - Rất tiếc, lỗi của tôi. 'SP' đó đã bị bỏ lại từ câu trả lời ban đầu của tôi, kể từ khi được chỉnh sửa, đã liên quan đến một đối tượng' SpatialPoints' thay vì 'SpatialPointsDataFrame'. Để tham khảo trong tương lai, bạn có thể xem các phiên bản SO cũ hơn bằng cách nhấp vào liên kết "đã chỉnh sửa ... trước" ngay bên dưới câu trả lời đã chỉnh sửa. Cảm ơn vì đã bắt được điều đó. –

12

Chuyển đổi vĩ độ và kinh độ điểm để UTM

library(sp) 
library(rgdal) 

#Function 
LongLatToUTM<-function(x,y,zone){ 
xy <- data.frame(ID = 1:length(x), X = x, Y = y) 
coordinates(xy) <- c("X", "Y") 
proj4string(xy) <- CRS("+proj=longlat +datum=WGS84") ## for example 
res <- spTransform(xy, CRS(paste("+proj=utm +zone=",zone," ellps=WGS84",sep=''))) 
return(as.data.frame(res)) 
} 

# Example 
x<-c(-94.99729,-94.99726,-94.99457,-94.99458,-94.99729) 
y<-c(29.17112, 29.17107, 29.17273, 29.17278, 29.17112) 
LongLatToUTM(x,y,15) 
0

Dựa trên mã trên, tôi cũng đã thêm một phiên bản của khu vực và phát hiện bán cầu (mà giải quyết vấn đề chuyển đổi, như mô tả trong một số ý kiến) + viết tắt cho CRS chuỗi và chuyển đổi trở lại WSG86:

library(dplyr) 
library(sp) 
library(rgdal) 
library(tibble) 

find_UTM_zone <- function(longitude, latitude) { 

# Special zones for Svalbard and Norway 
    if (latitude >= 72.0 && latitude < 84.0) 
     if (longitude >= 0.0 && longitude < 9.0) 
       return(31); 
    if (longitude >= 9.0 && longitude < 21.0) 
      return(33) 
    if (longitude >= 21.0 && longitude < 33.0) 
      return(35) 
    if (longitude >= 33.0 && longitude < 42.0) 
      return(37) 

    (floor((longitude + 180)/6) %% 60) + 1 
} 


find_UTM_hemisphere <- function(latitude) { 

    ifelse(latitude > 0, "north", "south") 
} 

# returns a DF containing the UTM values, the zone and the hemisphere 
longlat_to_UTM <- function(long, lat, units = 'm') { 

    df <- data.frame(
     id = seq_along(long), 
     x = long, 
     y = lat 
    ) 
    sp::coordinates(df) <- c("x", "y") 

    hemisphere <- find_UTM_hemisphere(lat) 
    zone <- find_UTM_zone(long, lat) 

    sp::proj4string(df) <- sp::CRS("+init=epsg:4326") 
    CRSstring <- paste0(
     "+proj=utm +zone=", zone, 
     " +ellps=WGS84", 
     " +", hemisphere, 
     " +units=", units) 
    if (dplyr::n_distinct(CRSstring) > 1L) 
     stop("multiple zone/hemisphere detected") 

    res <- sp::spTransform(df, sp::CRS(CRSstring[1L])) %>% 
     tibble::as_data_frame() %>% 
     dplyr::mutate(
      zone = zone, 
      hemisphere = hemisphere 
     ) 

    res 
} 

UTM_to_longlat <- function(utm_df, zone, hemisphere) { 

    CRSstring <- paste0("+proj=utm +zone=", zone, " +", hemisphere) 
    utmcoor <- sp::SpatialPoints(utm_df, proj4string = sp::CRS(CRSstring)) 
    longlatcoor <- sp::spTransform(utmcoor, sp::CRS("+init=epsg:4326")) 
    tibble::as_data_frame(longlatcoor) 
} 

đâu CRS("+init=epsg:4326") là viết tắt cho CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0").

tìm tài liệu tham khảo khu UTM: http://www.igorexchange.com/node/927