วิธีหยุด writeOGR ไม่ให้ย่อชื่อฟิลด์เมื่อใช้ไดรเวอร์“ ESRI Shapefile”


18

ขณะนี้ฉันกำลังใช้สคริปต์ต่อไปนี้เพื่อเพิ่มข้อมูลคุณลักษณะจากตารางไปยังรูปร่างหลายไฟล์:

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")
}

ฉันได้รับคำเตือนต่อไปนี้เมื่อสิ้นสุด:

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

เมื่อดูตารางแอตทริบิวต์ของ shapefiles หลังจากกระบวนการนี้ชื่อเขตข้อมูลถูกย่อให้เป็น 'ENGL_' แต่ฉันต้องการให้อยู่ในสถานะ 'ENGL_NAME' มีวิธีปิดตัวย่อนี้หรือไม่?

ความช่วยเหลือใด ๆ ที่ชื่นชมมาก


มีชื่อฟิลด์ใด ๆ ในรูปร่างไฟล์> 10 ตัวอักษรหรือไม่ ดูเหมือนว่าข้อผิดพลาดในการผูก R กับฉัน
geographika

1
สวัสดีฉันเพิ่งรันสคริปต์อีกครั้งและตอนนี้ก็ไม่ได้เป็นตัวย่อ ฉันไม่แน่ใจว่าเกิดอะไรขึ้นกับสิ่งนี้แม้ว่า ...
JPD

คำตอบ:


9

คุณไม่สามารถเป็นปัญหาของ shapefile ดูhttp://gdal.org/drv_shapefile.htmlภายใต้ 'ตัวเลือกการสร้าง'


ดังนั้นจึงไม่เป็นปัญหาของwriteOGR? เป็นรูปแบบจริงหรือไม่
โทมัส

1
แก้ไข. ความยาวชื่อคอลัมน์ dbf ถูก จำกัด รูปแบบอื่นเช่น sqlite / spatialite จะไม่ตัดทอนชื่อ (มีข้อ จำกัด ขนาดใหญ่มากใน sqlite แต่มีคำสั่งมากมายที่มีขนาดสูงกว่า 10)

3
มีความแตกต่างระหว่างตัวย่อปกติของชื่อคอลัมน์เมื่อเขียนถึง dbf และ writeOGR กำลังทำอะไรอยู่! writeOGR กำลังทำให้ชื่อฟิลด์สั้นลงและสั้นกว่า 10 ตัวอย่างของฉัน: ชื่อคอลัมน์ R ของฉัน "ora_nachweis_id" กลายเป็น "or_nch_" ในขณะที่ writeSpatilaPolygon ทำการย่อตามปกติ -> "ora_nachwe" แม้แต่ตัวแปรของฉัน "LblColor" (8 ตัวอักษร!) ก็กลายเป็น "LblColr"
Bernd V.

มีชื่อคอลัมน์ที่คล้ายกันในโครงสร้าง db / data หรือไม่ ฉันไม่สามารถทำซ้ำกับ ogr2ogr และ sqlite db ที่มีชื่อเหล่านั้นได้ หากคุณสามารถให้ตัวอย่างฉันสามารถดูเพิ่มเติมหรือบางทีการผูก R เป็นสาเหตุของปัญหา

1
การเชื่อมโยงนั้นตายแล้ว แต่ฉันมีรูปร่างที่มีชื่อฟิลด์ยาวกว่า 10 อักขระ เหตุใดจึงเป็นไปได้หากเป็นปัญหารูปร่างไฟล์
Matt

7

'ENGL_NAME' ของคุณไม่ควรย่อเลย (น้อยกว่า 10 ตัวอักษร) แต่ writeOGR มีความประสงค์ของตัวเองดูเหมือนว่า

แทน

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

คุณอาจลอง

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

เนื่องจาก writeSpatialShape ดูเหมือนไม่มีพารามิเตอร์สำหรับปลายทางฉันจึงพบวิธีแก้ไขปัญหานี้สลับไดเรกทอรีทำงานกลับไปกลับมา

ปัญหาอื่น ๆ ที่มีคือมันไม่ได้สร้างไฟล์. prj แต่เป็นปัญหาเล็กน้อยเมื่อเทียบกับชื่อฟิลด์ที่ถูกทำลาย

กำลังรอเวลาที่รูปแบบ + * # -! (รูปแบบ / ESRI Shapefile ตายแล้วและแทนที่ด้วย ... ใช่ไหม?


ถูกแทนที่ด้วย geopackage หรือไม่
jsta

3

ฉันมีปัญหาคล้ายกันที่ทำงานใน RStudio ตามคำแนะนำในความคิดเห็นและคำตอบต่าง ๆ ข้างต้นวิธีแก้ปัญหาเกรียมโลกของฉันคือ:

  • ที่จุดที่ SpatialWhethingDataFrame พร้อมที่จะเขียนลงใน Shape ให้ทำสำเนา
  • names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
  • names(copy@data) <- strtrim(names(copy@data), 10) เพียงเพื่อให้แน่ใจ
  • writeOGR(copy, dsn, layer, driver = 'ESRI Shapefile') แต่ยังไม่เปิดใช้
  • บันทึกสคริปต์, ล้างพื้นที่ทำงานรวมถึงวัตถุที่ซ่อนอยู่, รีสตาร์ท R, รันสคริปต์ทั้งหมดอีกครั้ง

writeOGR () ใช้ฐาน :: ตัวย่อ - นี่คือการทดสอบพร้อมสำเนาของสาย 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"  

คุณจะเห็นว่ามันเรียกว่าตัวย่อสองครั้ง (อาจไม่มีจุดหมายฉันไม่สามารถคิดได้ว่าคุณจะเรียกวงย่อยนั้น) อย่างไรและถ้าแม้แต่ชื่อคอลัมน์เดียว> 10 แล้วมันจะทำให้ชื่อคอลัมน์สั้นลงด้วย> 7 ตัวอักษร ฉันไม่ทราบสาเหตุที่ต้องล้างเวิร์กสเปซและรีสตาร์ทถ้า writeOGR ถูกเรียกใช้บนวัตถุเดียวกันก่อนหน้านี้ แต่อาจเป็นสิ่งที่เกี่ยวข้องกับ fld_names ซึ่งเป็นเวกเตอร์อักขระที่มีชื่อ มันอาจจะทำงานได้ดีขึ้นถ้า as.character () ถูกล้อมรอบตัวย่อ ()


เฮ้ขอบคุณ ฉันไม่ต้องการหลวมไฟล์ PRJ ของฉันดังนั้นการอ่านคำตอบนี้ช่วยได้ ฉันตั้งชื่อฟิลด์ทั้งหมด 10 ตัวหรือน้อยกว่าก่อนเรียกใช้ writeOGR และไม่มีตัวย่อเป็น 7
Nova

-1

ดังที่ได้กล่าวไปแล้วรูปร่างของไฟล์นั้นมีความยาวได้ไม่เกิน 10 ตัวอักษร writeOGR ตรงตามข้อกำหนดนี้โดยเปลี่ยนส่วนหัวของฟิลด์โดยใช้อัลกอริทึมที่จัดลำดับความสำคัญของอักขระที่จะลบเมื่อมีชื่อฟิลด์ที่เกินขีด จำกัด ฉันไม่แน่ใจว่ามันใช้งานได้อย่างไร แต่ดูเหมือนว่าจะตัดทอนชื่อฟิลด์ด้วยวิธีที่แปลกและคาดเดาไม่ได้และสามารถย่อชื่อฟิลด์ด้วยวิธีนี้ซึ่งตรงตามข้อกำหนด 10 ประการ

นี่คืองานของฉัน การใช้ strtrim () และการตั้งค่าความยาวอักขระเป็น 10 จะตัดชื่อฟิลด์เป็น 10 อักขระโดยคาดการณ์ได้ง่ายกว่าระบบอัตโนมัติของ writeOGR

ปัญหาหนึ่งที่คุณอาจมีคือถ้าคุณมีชื่อฟิลด์ที่เหมือนกันสำหรับอักขระ 10 ตัวแรก แต่ฉันไม่ค่อยมีปัญหานี้

ฉันใช้สิ่งนี้ทุกครั้งที่ฉันส่งออกไฟล์รูปร่างในกรณี

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")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.