Cara menghentikan writeOGR dari menyingkat Nama Bidang saat menggunakan driver "ESRI Shapefile"

18

Saat ini saya menggunakan skrip berikut untuk menambahkan beberapa data atribut dari sebuah tabel ke banyak bentuk individu:

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

Saya mendapatkan peringatan berikut di akhir:

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

Saat melihat tabel atribut shapefile setelah proses ini, nama bidang telah disingkat menjadi 'ENGL_', tapi saya ingin tetap sebagai 'ENGL_NAME'. Apakah ada cara untuk mematikan singkatan ini?

Setiap bantuan sangat dihargai.

JPD
sumber
Apakah ada nama field dalam shapefile> 10 karakter? Sepertinya ada bug di R binding kepada saya.
geografi
1
Halo, saya hanya menjalankan ulang skrip dan sekarang tidak menyingkat. Saya tidak yakin apa yang berubah untuk menyebabkan ini ...
JPD

Jawaban:

9

Anda tidak bisa, ini masalah shapefile. Lihat http://gdal.org/drv_shapefile.html di bawah 'Opsi Pembuatan'


sumber
jadi ini bukan masalah writeOGR? Apakah ini benar-benar masalah format?
Tomas
1
Benar. panjang nama kolom dbf terbatas. Format lain, misalnya sqlite / spatialite tidak akan memotong nama (ada batas yang sangat besar dalam sqlite, tetapi banyak urutan besarnya di atas 10).
3
Nah, ada perbedaan antara singkatan nama kolom yang normal saat menulis ke dbf dan apa yang dilakukan writeOGR di sana! writeOGR melumpuhkan bahkan nama bidang lebih pendek dari 10. Contoh saya: Nama kolom-R saya "ora_nachweis_id" menjadi "or_nch_" sementara writeSpatilaPolygon melakukan singkatan normal -> "ora_nachwe". Bahkan variabel saya "LblColor" (8 karakter!) Menjadi "LblColr".
Bernd V.
Apakah ada nama kolom yang serupa dalam struktur db / data? Saya tidak bisa meniru dengan ogr2ogr dan db sqlite dengan nama-nama itu. Jika Anda bisa memberikan sampel, saya bisa melihat lebih jauh, atau mungkin binding R menyebabkan masalah.
1
Tautan sudah mati, tetapi juga, saya memiliki shapefile dengan nama bidang lebih dari 10 karakter; mengapa ini mungkin jika ini masalah shapefile?
Matt
7

'ENGL_NAME' Anda tidak boleh disingkat sama sekali (kurang dari 10 karakter), tetapi tampaknya writeOGR sendiri.

Alih-alih

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

Anda mungkin mencoba

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

Karena writeSpatialShape tampaknya tidak memiliki parameter untuk tujuan, saya menemukan pemecahan masalah ini berpindah direktori kerja bolak-balik.

Masalah lain yang ada adalah, bahwa itu tidak menghasilkan file .prj, tapi itu masalah kecil, dibandingkan dengan nama bidang yang dihancurkan.

Menunggu saat + * # -! (/ Format ESRI Shapefile akhirnya mati dan digantikan oleh ... yah?

Bernd V.
sumber
Digantikan oleh geopackage?
jsta
3

Saya mengalami masalah serupa yang bekerja di RStudio. Per saran dalam berbagai komentar dan jawaban di atas, solusi saya yang hangus adalah:

  • pada titik di mana SpatialWh whateverDataFrame siap ditulis ke Shape, buat salinan
  • names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
  • names(copy@data) <- strtrim(names(copy@data), 10) hanya untuk memastikan
  • writeOGR(copy, dsn, layer, driver = 'ESRI Shapefile') tapi jangan jalankan dulu
  • simpan skrip, kosongkan ruang kerja termasuk objek tersembunyi, mulai ulang R, jalankan kembali seluruh skrip.

writeOGR () menggunakan basis :: singkatan - inilah tes dengan salinan baris 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"  

Anda dapat melihatnya benar-benar memanggil singkatan dua kali (mungkin tanpa tujuan, saya tidak tahu bagaimana Anda akan memicu sub-loop), dan jika bahkan satu nama kolom> 10 maka itu akan mempersingkat nama kolom dengan> 7 karakter. Saya tidak tahu mengapa kita harus menghapus ruang kerja dan me-restart jika writeOGR telah dijalankan pada objek yang sama sebelumnya, tapi mungkin itu ada hubungannya dengan fld_names menjadi vektor karakter bernama. Ini mungkin bekerja lebih baik jika as.character () dililit singkatan ().

obrl_soil
sumber
Hei, terima kasih. Saya tidak ingin kehilangan file PRJ saya jadi membaca jawaban ini membantu. Saya membuat SEMUA nama bidang saya 10 atau kurang karakter sebelum memanggil writeOGR dan tidak ada yang disingkat menjadi 7.
Nova
-1

Seperti yang telah disebutkan, shapefile memiliki batas karakter nama bidang 10 karakter. writeOGR memenuhi persyaratan ini dengan mengubah judul bidang menggunakan beberapa algoritma yang memprioritaskan karakter apa yang harus dihapus ketika ada nama bidang yang melebihi batas. Saya tidak yakin cara kerjanya, tetapi sepertinya memperpendek nama bidang dengan cara yang aneh dan tidak dapat diprediksi, dan dapat mempersingkat nama bidang dengan cara yang sudah memenuhi 10 persyaratan.

Inilah pekerjaan saya. Menggunakan strtrim () dan mengatur panjang karakter ke 10 akan memotong nama field menjadi 10 karakter lebih dapat diprediksi daripada otomatisasi writeOGR.

Satu masalah yang mungkin Anda miliki adalah jika Anda memiliki nama bidang yang identik untuk 10 karakter pertama, tetapi saya jarang memiliki masalah ini.

Saya menerapkan ini setiap kali saya mengekspor shapefile, untuk berjaga-jaga.

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")
JMT2080AD
sumber