Mở shapefile trong R? [đóng cửa]


64

Tôi cần mở một shapefile từ ArcMap trong R để sử dụng nó để phân tích địa lý hơn nữa. Tôi đã chuyển đổi nó thành tệp văn bản ASCII, nhưng trong R, nó được nhận dạng là data.frame. Hàm tọa độ không hoạt động ngay khi x và y được nhận dạng là không số.

Bạn có thể giúp đỡ để đối phó với nó?


1
Những loại shapefile? Tôi đang giả sử điểm vì nó có cột X và Y?
Simbamangu

Câu trả lời:


54

Sử dụng shapefile trực tiếp. Bạn có thể làm điều này một cách dễ dàng với rgdalhoặc sfcác gói và đọc hình dạng trong một đối tượng. Đối với cả hai gói bạn cần cung cấp dsn- nguồn dữ liệu, trong trường hợp của shapefile là thư mụclayer- đó là tên shapefile, trừ phần mở rộng:

# Read SHAPEFILE.shp from the current working directory (".")

require(rgdal)
shape <- readOGR(dsn = ".", layer = "SHAPEFILE")

require(sf)
shape <- read_sf(dsn = ".", layer = "SHAPEFILE")

(Đối với rgdal, trong OSX hay Linux, bạn có thể không sử dụng '~' viết tắt cho thư mục home như các nguồn dữ liệu ( dsn) thư mục - nếu không bạn sẽ nhận được vô ích "Không thể mở nguồn dữ liệu" Thông điệp. sfGói không có giới hạn này, trong số một số lợi thế khác.)

Điều này sẽ cung cấp cho bạn một đối tượng là Spatial * DataFrame (điểm, đường hoặc đa giác) - các trường của bảng thuộc tính có thể truy cập được theo cách của bạn giống như một khung dữ liệu thông thường, tức là shape$IDcho cột ID.

Nếu bạn muốn sử dụng tệp ASCII mà bạn đã nhập, thì bạn chỉ cần chuyển đổi các trường văn bản (ký tự) x và y thành số, ví dụ:

shape$x <- as.numeric(as.character(shape$x))
shape$y <- as.numeric(as.character(shape$y))
coordinates(shape) <- ~x + y

Chỉnh sửa 2015-01-18 : lưu ý rằng rgdal tốt hơn một chút so với maptools (mà tôi đề xuất ban đầu ở đây), chủ yếu vì nó tự động đọc và ghi thông tin chiếu.

Ghi chú:

  • các as.numeric(as.character())hàm lồng nhau - nếu văn bản ASCII của bạn được đọc là một yếu tố (có thể), điều này đảm bảo rằng bạn có được các giá trị số thay vì các mức yếu tố.
  • rgdalsfcó những cách khó hiểu khi truy cập các loại tệp và cơ sở dữ liệu khác nhau (ví dụ: đối với tệp GPX, DSN là tên tệp và lớp các thành phần riêng lẻ như điểm tham chiếu, điểm theo dõi, v.v.) và cần đọc kỹ các ví dụ trực tuyến.

R nên phân tích các trường số như vậy, tôi sẽ tưởng tượng rằng có một loại ký tự đặc biệt trong x và y. Ngoài ra, khi nhập, trừ khi được chỉ định khác nhau, các trường ký tự sẽ được ép buộc thành một yếu tố. Như vậy, một giảm tốc "as.numeric" đơn giản sẽ không hoạt động. Tôi cũng sẽ sử dụng "readORG" trong "rgdal" thay vì maptools.
Jeffrey Evans

@Jeffrey, readOGR chắc chắn là cách tốt hơn để xem - xem một số cuộc thảo luận về các câu hỏi R sau này ở đây trên gis.SE. Điểm tốt về sự ép buộc nhân tố; sẽ cập nhật với lồng nhau as.characterđể giải quyết vấn đề.
Simbamangu

Bạn có thể sử dụng ~, nhưng bạn sẽ phải gọi path.expand trên thư mục, ví dụ như readOGR (DSN = path.expand ( "~ / Downloads / cb_2016_us_zcta510_500k /"), lớp = "cb_2016_us_zcta510_500k")
hd1

3
Bằng cách nào đó tôi vẫn cần làm rõ câu trả lời thực sự chính xác này: dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufos

Tôi muốn lưu ý rằng dsnđối số không được chứa dấu gạch chéo --- ví dụ: dsn = "C:/Users/Downloads/"nên dsn = "C:/Users/Downloads". Hy vọng điều này sẽ giải quyết nỗi thất vọng của ai đó ...
Kim

21

Tôi đồng ý với Simbamangu và đã đồng ý về việc giữ lại shapefile nhưng muốn hướng sự chú ý của bạn đặc biệt đến thư viện rgdal. Theo liên kết được đề xuất bởi gissolve cho NCEAS và theo dõi thông qua các hướng dẫn cho rgdal. Nó có thể là khó khăn để cài đặt trên một số máy nhưng nó có thể cải thiện đáng kể kết quả khi nói đến dự đoán.

Thư viện maptools là tuyệt vời và cho phép bạn xác định phép chiếu cho shapefile mà bạn đang đọc, nhưng để làm như vậy, bạn cần biết cách chỉ định phép chiếu đó ở định dạng proj4. một ví dụ có thể trông giống như:

project2<-"+proj=eqdc +lat_0=0 +lon_0=0 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 +ellps=GRS80    
   +datum=NAD83 +units=m +no_defs" #USA Contiguous Equidistant Conic Projection
data.shape<-readShapePoly("./MyMap.shp",IDvar="FIPS",proj4string=CRS(project2))
plot(data.shape)

Nếu bạn muốn đi theo con đường này, thì tôi khuyên bạn nên http://spatialreference.org là nơi để tìm hiểu xem hình chiếu của bạn trông như thế nào trong định dạng proj4. Nếu điều đó có vẻ rắc rối với bạn, rgdal sẽ làm cho nó dễ dàng bằng cách đọc tệp .prj của ESRI (tệp chứa định nghĩa chiếu của ESRI cho shapefile. Để sử dụng rgdal trên cùng một tệp bạn chỉ cần viết:

library(rgdal)
data.shape<-readOGR(dsn="C:/Directory_Containing_Shapefile",layer="MyMap")
plot(data.shape)

Bạn có thể trượt băng mà không cần làm điều này nếu bạn chỉ làm việc với một shapefile duy nhất, nhưng ngay khi bạn bắt đầu xem xét nhiều nguồn dữ liệu hoặc phủ lên Google Maps, việc giữ cho các hình chiếu của bạn ở trạng thái tốt là điều cần thiết.

Đối với một số hướng dẫn hữu ích về dữ liệu không gian trong R, bao gồm một loạt các công cụ nhập và làm việc với các mẫu điểm, tôi có một số tài liệu khóa học cũ trực tuyến tại https://csde.washington.edu/workshop/point-potypes-and-raster -surfaces / (có thể tìm thấy nhiều hội thảo hơn ở đây ) có thể giúp bạn thấy các phương pháp này so sánh như thế nào trong thực tế.


+1 cho thông tin tham chiếu không gian ... đặc biệt là để nhấn mạnh việc sắp xếp các dự đoán!
Simbamangu

@csfowler, tôi đã thử sử dụng readOGR nhưng nó không nhập tệp .prj. Bất cứ ý tưởng tại sao? Tôi cũng ở UW, trong khoa sinh học.
Herman Toothrot

@ user4050, khó biết mà không thấy mã của bạn. Tôi giả sử có một tập tin .prj trong cùng một thư mục? và rằng bạn đã sử dụng giá trị mã hóa = "ESRI Shapefile" để đảm bảo rgdal biết đó là shapefile?
csfowler


17

Bạn có thể sử dụng sfthư viện để mở Shapefiles trực tiếp R. Nó nhanh hơn rgdalthư viện, kiểm tra ở đây: Các tính năng đơn giản cho R - Điểm chuẩn . Để biết thêm thông tin về sfgói kiểm tra r-spatial trang chủ của dự án .

# Load library
library('sf')

# Load shapefile
shapename <- read_sf('~/path/to/file.shp')

11

Một giải pháp dễ dàng trong năm 2017 là shapefile()chức năng trong rasterthư viện.

#Load library
library(raster)

#Load shapefile
shp <- shapefile("myshapefile")

CẬP NHẬT: Đây vẫn là một lựa chọn tốt trong năm 2019.


Điều này có thể được sử dụng để nhập từ một nguồn trực tuyến? Tôi
Tôi Del Toro

@IDelToro Không trực tiếp. Bạn sẽ cần tải nó xuống ổ cứng trước và sau đó tải nó từ đó.
Christopher

6

Một cách khác là sử dụng thư viện fastshp cung cấp ::

Các thường trình để xử lý các shapefiles ESRI lớn (.shp). Điều này bao gồm đọc, làm mỏng các điểm và khớp các điểm với các hình có chứa. Mục đích chính của gói này là cung cấp tốc độ để hỗ trợ các shapefile lớn (hàng triệu điểm). Đó là một số đơn đặt hàng nhanh hơn một số gói shapefile khác.

Đây là câu hỏi của tôi về SE về cách sử dụng nó với ggplot2:

Làm thế nào tôi có thể vẽ đồ thị shapefile được tải thông qua fastshp trong ggplot2?


1
Tôi thấy hơi khó chịu khi hàm read.shp không dẫn đến một đối tượng sp. Cho rằng cộng đồng R không gian đang hội tụ về điều này như là tiêu chuẩn thực tế để xử lý các đối tượng không gian, tôi thấy điều này hơi cẩu thả. Với đủ RAM và hệ điều hành 64 bit, việc đọc dữ liệu lớn không phải là vấn đề lớn. Với RAM 8GB, tôi đã đọc được 30 triệu điểm và 2,5 triệu đa giác bằng cách sử dụng rgdal mà không gặp vấn đề gì. Dưới đây là một số hướng sử dụng các đối tượng sp với ggplot2: github.com/hadley/ggplot2/wiki/plinating-polygon-shapefiles
Jeffrey Evans
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.