“ESRI Şekil Dosyası” sürücüsü kullanılırken writeOGR'nin Alan Adlarını kısaltmasını engelleme


18

Şu anda bir tablodan bazı şekil dosyaları çok öznitelik verileri eklemek için aşağıdaki komut dosyası kullanıyorum:

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

Sonunda aşağıdaki uyarıları alıyorum:

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

Bu işlemden sonra şekil dosyalarının öznitelik tablosunu görüntülerken Alan adı 'ENGL_' olarak kısaltılmış, ancak 'ENGL_NAME' olarak kalmasını istiyorum. Bu kısaltmayı kapatmanın bir yolu var mı?

Herhangi bir yardım çok takdir etmek.


Şekil dosyasında 10 karakterden büyük alan adları var mı? Bana R bağlamaları bir hata gibi görünüyor.
geographika

1
Merhaba, sadece senaryoyu yeniden çalıştırdım ve şimdi kısalmıyor. Buna rağmen neyin değiştiğinden emin değilim ...
JPD

Yanıtlar:


9

Yapamazsın, bu bir şekil dosyası sorunu. 'Oluşturma Seçenekleri' altındaki http://gdal.org/drv_shapefile.html adresine bakın.


yani bir sorun değil writeOGRmi? Aslında biçim midir?
Tomas

1
Doğru. dbf sütun adı uzunlukları sınırlıdır. Başka bir biçim, örneğin sqlite / spatialite isimleri kısaltmaz (sqlite'de çok büyük sınırlar vardır, ancak 10'un üzerinde büyüklük sıraları vardır).

3
Dbf'ye yazarken normal sütun adlarının kısaltması ile orada ne yazı yazılır arasında bir fark vardır! writeOGR, 10'dan daha kısa alan adlarını bile sakatlıyor. Örneklerim: RS sütunum "ora_nachweis_id", "or_nch_" olurken, writeSpatilaPolygon normal kısaltmayı yapıyor -> "ora_nachwe". Değişken "LblColor" bile (8 karakter!) "LblColr" olur.
Bernd V.

Db / data yapısında benzer sütun isimleri var mı? Ben ogr2ogr ve sqlite db ile bu isimleri ile çoğaltma olamazdı. Bir örnek sağlayabilirseniz daha fazla bakabilirim, ya da belki R bağlamaları sorunlara neden oluyor.

1
Bağlantı öldü, ama aynı zamanda alan adları 10 karakterden daha uzun olan şekil dosyaları var; bu bir şekil dosyası sorunu varsa neden mümkün?
Matt

7

'ENGL_NAME' öğeniz hiç kısaltılmamalıdır (10 karakterden az), ancak writeOGR'nin kendi iradesi var gibi görünüyor.

Onun yerine

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

deneyebilirsin

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 hedef için bir parametre yok gibi görünüyor, ben bu geçici çözüm çalışma dizini ileri geri geçiş bulundu.

Diğer sorun ise, bir .prj dosyası üretmemesi, ancak bu, yok edilen alan adlarıyla karşılaştırıldığında küçük bir sorundur.

+ * # -! (/ ESRI Shapefile biçiminin sonunda öldüğü ve yerini ... iyi aldığı zaman mı bekliyorsunuz?


Geopackage ile değiştirildi mi?
jsta

3

RStudio'da benzer sıkıntılar yaşıyorum. Yukarıdaki çeşitli yorum ve cevaplardaki tavsiyelere göre, yakılmış toprak çözümüm:

  • SpatialWhateverDataFrame öğesinin Shape öğesine yazılmaya hazır olduğu noktada bir kopyasını oluşturun
  • names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
  • names(copy@data) <- strtrim(names(copy@data), 10) Sadece emin olmak için
  • writeOGR(copy, dsn, layer, driver = 'ESRI Shapefile') ama henüz çalıştırma
  • betiği kaydedin, gizli nesneler dahil çalışma alanını temizleyin, R'yi yeniden başlatın, tüm betiği yeniden çalıştırın.

writeOGR () base :: abbreviate kullanır - 158-164 satırlarının bir kopyasıyla bir test:

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"  

Aslında iki kez kısaltma çağırdığını görebilirsiniz (muhtemelen anlamsızca, bu alt döngüyü nasıl tetikleyeceğinizi anlayamıyorum) ve bir sütun adı> 10 olsa bile,> 7 karakterle herhangi bir sütun adını kısaltacaktır. Neden bir çalışma alanı temizlemek ve writeOGR daha önce aynı nesne üzerinde çalıştırıldıysa yeniden başlatmak zorunda anlayamıyorum, ama belki onun bir şey fld_names adlı bir karakter vektörü ile ilgili. As.character () kısaltması () içine sarılmışsa daha iyi çalışabilir.


Hey teşekkürler. PRJ dosyamı kaybetmek istemedim, bu yüzden bu yanıtı okumak yardımcı oldu. WriteOGR'ı çağırmadan önce TÜM alan isimlerimi 10 veya daha az karakter yaptım ve hiçbiri 7 olarak kısaltılmadı.
Nova

-1

Daha önce de belirtildiği gibi, şekil dosyalarının alan adı karakter sınırı 10 karakterdir. writeOGR, sınırı aşan bir alan adı olduğunda hangi karakterlerin kaldırılacağına öncelik veren bir algoritma kullanarak alan başlıklarını değiştirerek bu gereksinimi karşılar. Nasıl çalıştığından emin değilim, ancak alan adlarını garip ve öngörülemeyen yollarla kısaltmış gibi görünüyor ve alan adlarını zaten 10 gereksinimi karşılayan bu şekilde kısaltabilir.

İşte benim işim. Strtrim () kullanılması ve karakter uzunluğunun 10 olarak ayarlanması, alan adlarını writeOGR'nin otomasyonundan daha öngörülebilir şekilde 10 karaktere keser.

Sahip olabileceğiniz bir sorun, ilk 10 karakter için aynı olan alan adlarınız varsa, ancak nadiren bu sorunum var.

Her şekil biçiminde her ihracat yaptığımda bunu her ihtimale karşı uyguluyorum.

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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.