Cách dừng writeOGR từ viết tắt Tên trường khi sử dụng trình điều khiển Shapefile của ES ESRI


16

Tôi hiện đang sử dụng tập lệnh sau để thêm một số dữ liệu thuộc tính từ một bảng vào nhiều tệp shapefile riêng lẻ:

library(rgdal)
specieslist <- read.csv("SpeciesList1.txt", header=F)
attdata <- read.table("TestAtt.csv", sep = ",", header=T)
for (n in 1:dim(specieslist)[1]) 
{
speciesname <- specieslist[n,1]
shp <- readOGR("Mesoamerica_modified_polygons", speciesname)
shp$ENGL_NAME<-attdata[n,2]
writeOGR(shp, "PolygonsV2", speciesname, driver="ESRI Shapefile")
}

Tôi nhận được (các) cảnh báo sau ở cuối:

1: In writeOGR(shp, "PolygonsV2", speciesname, driver = "ESRI Shapefile") :
Field names abbreviated for ESRI Shapefile driver

Khi xem bảng thuộc tính của các shapefiles sau quá trình này, tên Trường đã được rút ngắn thành 'ENGL_', nhưng tôi muốn nó ở dạng 'ANHL_NAME'. Có cách nào để tắt chữ viết tắt này không?

Bất kỳ trợ giúp nhiều đánh giá cao.


Có bất kỳ tên trường nào trong shapefile> 10 ký tự không? Trông giống như một lỗi trong các ràng buộc R với tôi.
geographika

1
Xin chào, tôi vừa chạy lại tập lệnh và bây giờ nó không viết tắt. Tôi không chắc điều gì đã thay đổi để gây ra điều này mặc dù ...
JPD

Câu trả lời:


7

Bạn không thể, đó là một vấn đề shapefile. Xem http://gdal.org/drv_shapefile.html trong 'Tùy chọn sáng tạo'


Vì vậy, nó không phải là một vấn đề của writeOGR? Có thực sự là vấn đề của định dạng?
Tomas

1
Chính xác. Độ dài tên cột dbf bị giới hạn. Một định dạng khác, ví dụ sqlite / spatialite sẽ không cắt bớt tên (có giới hạn rất lớn trong sqlite, nhưng nhiều đơn đặt hàng có cường độ trên 10).

3
Chà, có một sự khác biệt giữa tên viết tắt thông thường của tên cột khi viết vào dbf và writeOGR đang làm gì ở đó! writeOGR làm tê liệt các tên trường chẵn ngắn hơn 10. Ví dụ của tôi: Tên cột R của tôi "ora_nachweis_id" trở thành "or_nch_" trong khi writeSpatilaPolygon viết tắt bình thường -> "ora_nachwe". Ngay cả biến "LblColor" của tôi (8 ký tự!) Trở thành "LblColr".
Bernd V.

Có các tên cột tương tự trong cấu trúc db / dữ liệu không? Tôi không thể sao chép với ogr2ogr và db sqlite với những tên đó. Nếu bạn có thể cung cấp một mẫu tôi có thể nhìn xa hơn, hoặc có lẽ các ràng buộc R đang gây ra vấn đề.

1
Liên kết đã chết, nhưng đồng thời, tôi có các shapefile với tên trường dài hơn 10 ký tự; Tại sao điều này có thể nếu đó là một vấn đề shapefile?
Matt

7

'EngL_NAME' của bạn hoàn toàn không nên viết tắt (dưới 10 ký tự), nhưng writeOGR có ý chí riêng của nó, dường như.

Thay vì

writeOGR(shp, "PolygonsV2", speciesname, driver="ESRI Shapefile")

bạn có thể thử

library(maptools)
currdir <- getwd() #store your current working directory
setwd(paste(currdir,"PolygonsV2",sep="/")) #switch to your desired folder

writeSpatialShape(shp, speciesname) # write shapefile

setwd(currdir) #switch back to parent folder

Vì writeSpatialShape dường như không có tham số cho đích, tôi đã tìm thấy cách giải quyết này khi chuyển đổi thư mục làm việc qua lại.

Vấn đề khác là, nó không tạo ra tệp .prj, nhưng đó là một vấn đề nhỏ, so với tên trường bị phá hủy.

Chờ đợi thời điểm định dạng + * # -! (/ ESRI Shapefile cuối cùng đã chết và được thay thế bằng ... tốt?


Thay thế bằng địa lý?
jsta

3

Tôi đã gặp rắc rối tương tự khi làm việc trong RStudio. Theo lời khuyên trong các bình luận và câu trả lời khác nhau ở trên, giải pháp thiêu đốt của tôi là:

  • tại điểm mà SpatialWhthingDataFrame đã sẵn sàng để được ghi vào Shape, tạo một bản sao
  • names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
  • names(copy@data) <- strtrim(names(copy@data), 10) chỉ để được chắc chắn
  • writeOGR(copy, dsn, layer, driver = 'ESRI Shapefile') nhưng đừng chạy nó
  • lưu tập lệnh, xóa không gian làm việc bao gồm các đối tượng ẩn, khởi động lại R, chạy lại toàn bộ tập lệnh.

writeOGR () sử dụng cơ sở :: viết tắt - đây là một bài kiểm tra với một bản sao của các dòng 158-164:

fld_names <- c('short', 'longlonglong', 'middle_1')
if (any(nchar(fld_names) > 10)) {
    fld_names <- abbreviate(fld_names, minlength = 7)
    warning("Field names abbreviated for ESRI Shapefile driver")
    if (any(nchar(fld_names) > 10)) 
      fld_names <- abbreviate(fld_names, minlength = 5)
  }

> fld_names
       short longlonglong     middle_1 
     "short"    "lnglngl"    "middl_1" 
> names(fld_names)
[1] "short"        "longlonglong" "middle_1"  

Bạn có thể thấy nó thực sự gọi viết tắt hai lần (có thể là vô nghĩa, tôi không thể hiểu làm thế nào bạn kích hoạt vòng lặp phụ đó) và nếu thậm chí một tên cột> 10 thì nó sẽ rút ngắn bất kỳ tên cột nào có> 7 ký tự. Tôi không thể hiểu tại sao người ta phải xóa không gian làm việc và khởi động lại nếu writeOGR đã được chạy trên cùng một đối tượng trước đó, nhưng có lẽ nó phải làm gì đó với fld_names là một vectơ ký tự được đặt tên. Nó có thể hoạt động tốt hơn nếu as.character () được bao quanh viết tắt ().


Này cảm ơn nhé. Tôi không muốn mất tập tin PRJ của mình vì vậy đọc câu trả lời này đã giúp. Tôi đã tạo TẤT CẢ tên trường của mình từ 10 ký tự trở xuống trước khi gọi writeOGR và không có ký tự nào được viết tắt thành 7.
Nova

-1

Như đã đề cập, shapefiles có giới hạn ký tự tên trường là 10 ký tự. writeOGR đáp ứng yêu cầu này bằng cách thay đổi các tiêu đề trường bằng một số thuật toán ưu tiên loại bỏ các ký tự khi có tên trường vượt quá giới hạn. Tôi không chắc nó hoạt động như thế nào, nhưng dường như nó rút ngắn tên trường theo những cách lạ và không thể đoán trước, và có thể rút ngắn tên trường theo cách đã đáp ứng 10 yêu cầu.

Đây là công việc của tôi. Sử dụng strtrim () và đặt độ dài ký tự thành 10 sẽ cắt bớt tên trường thành 10 ký tự dự đoán hơn so với tự động hóa của writeOGR.

Một vấn đề mà bạn có thể gặp phải là nếu bạn có tên trường giống hệt nhau cho 10 ký tự đầu tiên, nhưng tôi hiếm khi gặp vấn đề này.

Tôi áp dụng điều này mỗi khi tôi xuất một shapefile, chỉ trong trường hợp.

library(sp)
library(rgdal)

table <- data.frame(X_Coordinates = runif(10)*1000, 
                    Y_Coordinates = runif(10)*1000, 
                    LongFieldNameForData = runif(10))

p <- SpatialPointsDataFrame(SpatialPoints(table), data = table)

names(p) <- strtrim(names(points),10)

writeOGR(p, "OutputDirectory", "Points", "ESRI Shapefile")
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.