「ESRI Shapefile」ドライバーの使用時にwriteOGRがフィールド名を短縮しないようにする方法


16

現在、次のスクリプトを使用して、テーブルからいくつかの属性データを多数の個々のシェープファイルに追加しています。

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

このプロセスの後にシェープファイルの属性テーブルを表示すると、フィールド名は「ENGL_」に短縮されましたが、「ENGL_NAME」のままにしておきたいです。これを短縮する方法はありますか?

助けていただければ幸いです。


シェープファイルのフィールド名のいずれかが10文字を超えていますか?私には、Rバインディングのバグのように見えます。
geographika

1
こんにちは。スクリプトを再実行しましたが、現在は短縮されていません。私は...このかかわらを引き起こすことが変わったのかわからないんだけど
JPD

回答:


7

できません、シェープファイルの問題です。「作成オプション」の下のhttp://gdal.org/drv_shapefile.htmlを参照してください


それは問題ではありませんwriteOGRか?それは実際にフォーマットの問題ですか?
トマス14

1
正しい。dbf列名の長さには制限があります。別の形式、たとえばsqlite / spatialiteは名前を切り捨てません(sqliteには非常に大きな制限がありますが、10を超える桁数があります)。

3
さて、dbfへの書き込み時の列名の通常の省略形とそこで行われるwriteOGRには違いがあります!writeOGRは10未満のフィールド名でも不自由です。私の例:私のR列名「ora_nachweis_id」は「or_nch_」になりますが、writeSpatilaPolygonは通常の略語->「ora_nachwe」になります。私の変数 "LblColor"(8文字!)でも "LblColr"になります。
ベルント

db / data構造に類似した列名はありますか?ogr2ogrとこれらの名前のsqlite dbで複製できませんでした。サンプルを提供できる場合は、さらに調査するか、Rバインディングが問題を引き起こしている可能性があります。

1
リンクは機能していませんが、フィールド名が10文字よりはるかに長いシェープファイルもあります。シェープファイルの問題である場合、なぜこれが可能ですか?
マット

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には宛先のパラメーターがないように見えるため、この回避策は作業ディレクトリを前後に切り替えることを発見しました。

そこにあるもう1つの問題は、.prjファイルを生成しないことですが、破壊されたフィールド名と比較すると小さな問題です。

+ *#-!(/ ESRI Shapefile形式が最終的に無効になり、...に置き換えられるときを待っていますか?


ジオパッケージに置き換えられましたか?
jsta

3

RStudioで同様の問題が発生しています。上記のさまざまなコメントと回答のアドバイスによると、私の焦土は次のとおりです。

  • SpatialWhateverDataFrameを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()はbase :: abbreviateを使用します- 行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"  

実際にabbreviateを2回呼び出していることがわかります(無意味かもしれませんが、そのサブループをどのようにトリガーするかわかりません)。1つの列名が10を超えると、7文字を超える列名が短くなります。同じオブジェクトで以前にwriteOGRを実行した場合にワークスペースをクリアして再起動する必要がある理由はわかりませんが、おそらくfld_namesが名前付き文字ベクトルであることに関係しています。as.character()がabbreviate()でラップされていると、より適切に動作する場合があります。


ねえ、ありがとう。私はPRJファイルを失いたくなかったので、この回答を読むことは助けになりました。私はwriteOGRを呼び出す前に、すべての私のフィールド名10文字以下を行い、いずれも7と略されなかった
ノヴァ

-1

既に述べたように、シェープファイルのフィールド名の文字数制限は10文字です。writeOGRは、制限を超えるフィールド名がある場合に削除する文字を優先するアルゴリズムを使用してフィールド見出しを変更することにより、この要件を満たしています。私はそれがどのように機能するのか分かりませんが、奇妙で予測不可能な方法でフィールド名を短縮するようであり、すでに10の要件を満たしたこの方法でフィールド名を短縮できます。

これが私の回避策です。strtrim()を使用し、文字の長さを10に設定すると、writeOGRの自動化よりも予想どおりにフィールド名が10文字に切り捨てられます。

発生する可能性のある問題の1つは、最初の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.