"ESRI शेपफाइल" ड्राइवर का उपयोग करते समय फील्ड नाम को संक्षिप्त करने से राइटॉग को कैसे रोकें


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

इस प्रक्रिया के बाद शेपफाइल्स की विशेषता तालिका को देखते समय, फ़ील्ड नाम को 'ENGL_' में छोटा कर दिया गया है, लेकिन मैं चाहता हूं कि यह 'ENGL_NAME' के रूप में बना रहे। क्या इस संक्षिप्त तरीके को बंद करने का कोई तरीका है?

किसी भी मदद की बहुत सराहना की।


>> 10 वर्णों में से कोई भी फ़ील्ड नाम नहीं है? मुझे R बाइंडिंग में एक बग की तरह दिखता है।
जियोग्राफिका

1
नमस्ते वहाँ, मैं अभी स्क्रिप्ट फिर से भागा और अब यह संक्षिप्त नहीं है। मुझे यकीन नहीं है कि इसे बदलने का क्या कारण है ...
JPD

जवाबों:


9

आप नहीं कर सकते, यह एक आकार का मुद्दा है। 'सृजन विकल्प' के तहत http://gdal.org/drv_shapefile.html देखें


तो यह एक मुद्दा नहीं है writeOGR? क्या यह वास्तव में प्रारूप का मुद्दा है?
टॉमस

1
सही बात। dbf कॉलम नाम की लंबाई सीमित है। एक अन्य प्रारूप, उदाहरण के लिए, sqlite / स्थानिक नामों को काट नहीं देगा (sqlite में बहुत बड़ी सीमाएं हैं, लेकिन 10 से ऊपर परिमाण के कई आदेश हैं)।

3
खैर, कॉलम नामों के सामान्य संक्षिप्त नाम के बीच अंतर होता है जब dbf पर लिखना होता है और वहां राइटॉग क्या होता है! राइटऑपआर 10. फील्ड से भी छोटे नामों को अपंग कर रहा है। मेरे उदाहरण: माय आर-कॉलम नाम "ora_nachweis_id" हो जाता है "or_nch_" जबकि राइटसिपीला पॉलीगॉन सामान्य संक्षिप्त नाम करता है -> ""a_nachwe"। यहां तक ​​कि मेरा चर "LblColor" (8 अक्षर!) "LblColr" बन जाता है।
बेरंड वी। 19

Db / डेटा संरचना में समान कॉलम नाम हैं? मैं उन नामों के साथ ogr2ogr और एक sqlite DB के साथ नकल नहीं कर सकता। यदि आप एक नमूना प्रदान कर सकते हैं जो मैं आगे देख सकता हूं, या शायद आर बाइंडिंग समस्या पैदा कर रहे हैं।

1
लिंक मर चुका है, लेकिन साथ ही, मेरे पास 10 अक्षर से अधिक लंबे क्षेत्र के नाम के आकार हैं; यदि यह एक आकार का मुद्दा है तो यह क्यों संभव है?
मैट

7

आपके 'ENGL_NAME' को बिल्कुल भी संक्षिप्त नहीं किया जाना चाहिए (10 वर्णों से कम), लेकिन राइटऑर्ग की अपनी इच्छा है, ऐसा लगता है।

के बजाय

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

जैसा कि राइटस्पैटियलशैप में लगता है कि गंतव्य के लिए कोई पैरामीटर नहीं है, मैंने इस वर्कअराउंड को वर्किंग डायरेक्टरी को आगे और पीछे स्विच किया।

दूसरी समस्या यह है, कि यह .prj-file का उत्पादन नहीं करता है, लेकिन नष्ट किए गए फ़ील्ड नामों की तुलना में एक मामूली समस्या है।

उस समय की प्रतीक्षा की जा रही है जब + * # -! (/ ESRI शेपफाइल प्रारूप अंततः मृत हो गया हो और उसकी जगह ... अच्छी तरह से?


जियोपैकेज द्वारा प्रतिस्थापित?
jsta

3

मुझे RStudio में काम करने में समान परेशानी हो रही है। उपरोक्त विभिन्न टिप्पणियों और उत्तरों में सलाह के अनुसार, मेरा झुलसा हुआ पृथ्वी समाधान है:

  • उस बिंदु पर जहां SpatialWhateverDataFrame आकृति को लिखने के लिए तैयार है, एक प्रतिलिपि बनाएं
  • 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') लेकिन इसे अभी तक न चलाएं
  • स्क्रिप्ट को सहेजें, छुपी हुई वस्तुओं सहित कार्यक्षेत्र को साफ़ करें, आर को पुनरारंभ करें, पूरी स्क्रिप्ट को फिर से चलाएँ।

राइटऑआरआर () आधार का उपयोग करता है :: संक्षिप्त - यहाँ लाइनों की एक कॉपी के साथ एक परीक्षण है 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 वर्णों के साथ किसी भी स्तंभ का नाम छोटा कर देगा। मैं यह नहीं जान सकता कि किसी को कार्यक्षेत्र को खाली करना है और यदि पहले ही एक ही ऑब्जेक्ट पर राइटऑर्ग चलाया गया है, तो उसे पुनरारंभ करना होगा, लेकिन शायद fld_names का नाम चरित्र वेक्टर होने के साथ कुछ करना है। यह बेहतर हो सकता है अगर as.character () संक्षिप्त () के आसपास लिपटे थे।


धन्यवाद। मैं अपनी PRJ फ़ाइल को ढीला नहीं करना चाहता था इसलिए इस उत्तर को पढ़ने से मदद मिली। मैंने राइटॉग को कॉल करने से पहले अपने सभी फील्ड के 10 या उससे कम अक्षरों को नाम दिया और किसी को भी संक्षिप्त नहीं किया गया। 7.
नोवा

-1

जैसा कि पहले ही उल्लेख किया गया है, शेपफाइल्स में 10 वर्णों की फ़ील्ड नाम वर्ण सीमा होती है। राइटओआरआरआर इस आवश्यकता को कुछ एल्गोरिथ्म का उपयोग करके फ़ील्ड हेडिंग को बदलकर पूरा करता है जो प्राथमिकता देता है कि कोई फ़ील्ड नाम जब सीमा से अधिक हो तो उसे कैसे हटाया जाए। मुझे यकीन नहीं है कि यह कैसे काम करता है, लेकिन यह अजीब और अप्रत्याशित तरीके से क्षेत्र के नामों को छोटा करने के लिए लगता है, और इस तरह से क्षेत्र के नाम को छोटा कर सकता है जो पहले से ही 10 की आवश्यकता को पूरा करता है।

यहाँ मेरे काम के आसपास है। स्ट्रेट्रिम () का उपयोग करना और वर्ण की लंबाई को 10 तक सेट करना क्षेत्र के नामों को 10 वर्णों तक सीमित कर देगा जो कि राइटोग्रॉ के ऑटोमेशन से अधिक अनुमानित है।

एक मुद्दा जो आपके पास हो सकता है, यदि आपके पास फ़ील्डनाम हैं जो पहले 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")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.