เปิด Shapefile ใน R หรือไม่ [ปิด]


64

ฉันจำเป็นต้องเปิด shapefile จาก ArcMap ใน R เพื่อใช้สำหรับการวิเคราะห์ทางภูมิศาสตร์เพิ่มเติม ฉันแปลงมันเป็นไฟล์ข้อความ ASCII แต่ใน R มันได้รับการยอมรับว่าเป็น data.frame ฟังก์ชันพิกัดไม่ทำงานทันทีที่ x และ y ได้รับการยอมรับว่าไม่ใช่ตัวเลข

คุณช่วยจัดการกับมันได้ไหม?


1
Shapefile ชนิดใด ฉันสมมติว่ามีจุดเนื่องจากมีคอลัมน์ X และ Y
Simbamangu

คำตอบ:


54

ใช้ shapefile โดยตรง คุณสามารถทำได้อย่างง่ายดายด้วยแพคเกจrgdalหรือsfและอ่านรูปร่างในวัตถุ สำหรับแพ็กเกจทั้งสองที่คุณต้องระบุdsn- แหล่งข้อมูลซึ่งในกรณีของ shapefile คือไดเร็กทอรีและlayer- ซึ่งเป็นชื่อ shapefile, ส่วนขยายลบ:

# Read SHAPEFILE.shp from the current working directory (".")

require(rgdal)
shape <- readOGR(dsn = ".", layer = "SHAPEFILE")

require(sf)
shape <- read_sf(dsn = ".", layer = "SHAPEFILE")

(สำหรับ rgdal ใน OSX หรือ Linux คุณไม่สามารถใช้ '~' ชวเลขสำหรับไดเรกทอรีบ้านเป็นแหล่งข้อมูล ( dsn) - มิฉะนั้นคุณจะได้รับข้อความ "ไม่สามารถเปิดแหล่งข้อมูล" sfไม่ได้แพคเกจไม่ได้ มีข้อ จำกัด นี้ท่ามกลางข้อดีอื่น ๆ )

สิ่งนี้จะทำให้คุณมีวัตถุซึ่งเป็น Spatial * DataFrame (จุดเส้นหรือรูปหลายเหลี่ยม) - ฟิลด์ของตารางแอตทริบิวต์นั้นจะสามารถเข้าถึงคุณได้ในลักษณะเดียวกับ dataframe ทั่วไปเช่นshape$IDสำหรับคอลัมน์ ID

หากคุณต้องการใช้ไฟล์ ASCII ที่คุณนำเข้าคุณควรแปลงฟิลด์ข้อความ (ตัวอักษร) x และ y เป็นตัวเลขเช่น:

shape$x <- as.numeric(as.character(shape$x))
shape$y <- as.numeric(as.character(shape$y))
coordinates(shape) <- ~x + y

แก้ไข 2015-01-18 : โปรดทราบว่า rgdal ดีกว่า maptools เล็กน้อย (ซึ่งตอนแรกฉันแนะนำไว้ที่นี่) ส่วนใหญ่เป็นเพราะมันอ่านและเขียนข้อมูลการฉายโดยอัตโนมัติ

หมายเหตุ:

  • as.numeric(as.character())ฟังก์ชั่นที่ซ้อนกัน- หากข้อความ ASCII ของคุณถูกอ่านเป็นปัจจัย (น่าจะเป็น) สิ่งนี้ช่วยให้แน่ใจว่าคุณจะได้รับค่าตัวเลขแทนระดับปัจจัย
  • rgdalและsfมีวิธีการที่สับสนในการเข้าถึงไฟล์และฐานข้อมูลประเภทต่าง ๆ (เช่นสำหรับไฟล์ GPX, dsn เป็นชื่อไฟล์และเลเยอร์ส่วนประกอบแต่ละตัวเช่น waypoint, trackpoint ฯลฯ ) และจำเป็นต้องมีการอ่านตัวอย่างออนไลน์อย่างระมัดระวัง

R ควรแยกวิเคราะห์ฟิลด์ตัวเลขดังนั้นฉันจะจินตนาการว่ามีชนิดอักขระพิเศษใน x และ y นอกจากนี้ในการนำเข้านอกจากจะระบุแตกต่างกันแล้วฟิลด์อักขระจะถูกรวมเข้าด้วยกันเป็นปัจจัย เช่นนี้การชะลอตัวแบบ "as.numeric" แบบธรรมดาจะไม่ทำงาน ฉันจะใช้ "readORG" ใน "rgdal" มากกว่า maptools
เจฟฟรีย์อีแวนส์

@ Jeffrey readOGR เป็นวิธีที่ดีกว่าที่จะไปแน่นอน - ดูการสนทนาเกี่ยวกับคำถาม R ต่อมาที่นี่ใน gis.SE จุดดีในการบังคับปัจจัย จะอัปเดตพร้อมกับซ้อนas.characterเพื่อแก้ไขปัญหา
Simbamangu

คุณสามารถใช้ ~ แต่คุณจะต้องเรียก path.expand ในไดเรกทอรีเช่น readOGR (dsn = path.expand ("~ / ดาวน์โหลด / cb_2016_us_zcta510_500k /"), layer = "cb_2016_us_zcta510_500k")
hd1

3
ยังไงก็เถอะฉันยังต้องการคำชี้แจงที่ถูกต้องจริง ๆ นี้: dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufos

ฉันต้องการที่จะทราบว่าdsnอาร์กิวเมนต์ไม่ควรมีเครื่องหมายทับต่อท้าย --- เช่นควรจะเป็นdsn = "C:/Users/Downloads/" dsn = "C:/Users/Downloads"หวังว่านี่จะช่วยแก้ไขความคับข้องใจของใครบางคนได้บ้าง ...
คิม

21

ฉันเห็นด้วยกับ Simbamangu และ gissolved ในแง่ของการรักษารูปร่างไฟล์ แต่ต้องการที่จะนำความสนใจของคุณโดยเฉพาะไปยังห้องสมุด rgdal ไปตามลิงก์ที่แนะนำโดย gissolved สำหรับ NCEAS และปฏิบัติตามคำแนะนำสำหรับ rgdal มันอาจเป็นเรื่องยากที่จะติดตั้งในเครื่องบางเครื่อง แต่สามารถปรับปรุงผลลัพธ์ได้อย่างมีนัยสำคัญเมื่อพูดถึงการคาดการณ์

ไลบรารี่ maptools นั้นยอดเยี่ยมและช่วยให้คุณสามารถกำหนดโปรเจคชันสำหรับ shapefile ที่คุณกำลังอ่าน แต่ต้องทำเช่นนั้นคุณจำเป็นต้องรู้วิธีระบุโปรเจคชันในรูปแบบ proj4 ตัวอย่างอาจมีลักษณะเช่น:

project2<-"+proj=eqdc +lat_0=0 +lon_0=0 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 +ellps=GRS80    
   +datum=NAD83 +units=m +no_defs" #USA Contiguous Equidistant Conic Projection
data.shape<-readShapePoly("./MyMap.shp",IDvar="FIPS",proj4string=CRS(project2))
plot(data.shape)

หากคุณต้องการไปเส้นทางนี้ฉันขอแนะนำhttp://spatialreference.orgเป็นสถานที่ที่จะไปพิจารณาว่าการฉายภาพของคุณเป็นอย่างไรในรูปแบบ proj4 หากดูเหมือนว่าคุณจะยุ่งยาก rgdal จะทำให้ง่ายขึ้นโดยการอ่านไฟล์. prj ของ ESRI เชพไฟล์ (ไฟล์ที่มีคำจำกัดความการฉายของ ESRI สำหรับเชพไฟล์) หากต้องการใช้ rgdal บนไฟล์เดียวกันคุณก็แค่เขียน:

library(rgdal)
data.shape<-readOGR(dsn="C:/Directory_Containing_Shapefile",layer="MyMap")
plot(data.shape)

คุณสามารถเล่นสเก็ตได้โดยไม่ต้องทำสิ่งนี้หากคุณเพียงแค่ทำงานกับไฟล์รูปร่างเดียว แต่ทันทีที่คุณเริ่มดูแหล่งข้อมูลหลายแหล่งหรือซ้อนทับด้วย Google แผนที่การคาดการณ์ของคุณให้อยู่ในสภาพดีจึงเป็นสิ่งจำเป็น

สำหรับคำแนะนำที่เป็นประโยชน์เกี่ยวกับข้อมูลเชิงพื้นที่ใน R รวมถึงสิ่งต่างๆมากมายเกี่ยวกับการนำเข้าและการทำงานกับรูปแบบจุดฉันมีสื่อการเรียนการสอนแบบออนไลน์ที่https://csde.washington.edu/workshop/point-patterns-and-raster -surfaces / (สามารถดูเวิร์กช็อปเพิ่มเติมได้ที่นี่ ) ซึ่งอาจช่วยให้คุณเห็นว่าวิธีการเหล่านี้เปรียบเทียบในทางปฏิบัติอย่างไร


+1 สำหรับข้อมูลอ้างอิงเชิงพื้นที่ ... โดยเฉพาะอย่างยิ่งสำหรับการเน้นการจัดทำประมาณการออก
Simbamangu

@csfowler ฉันพยายามใช้ readOGR แต่ไม่ได้นำเข้าไฟล์. prj มีความคิดอะไรไหม ฉันอยู่ที่ UW เช่นกันในแผนกชีววิทยา
Herman Toothrot

@ user4050 ยากที่จะทราบโดยไม่เห็นรหัสของคุณ ฉันคิดว่ามีไฟล์. prj อยู่ในไดเรกทอรีเดียวกันหรือไม่ และคุณใช้ค่า encoding = "ESRI Shapefile" เพื่อให้แน่ใจว่า rgdal รู้ว่ามันเป็นรูปร่างไฟล์หรือไม่
csfowler

17

ฉันคิดว่าคุณไม่ควรแปลง Shapefile เป็น ASCII แต่ให้ใช้ Shapefile โดยตรงกับส่วนขยายอวกาศอย่างใดอย่างหนึ่ง นี่คุณจะพบสามวิธีในการอ่าน (และเขียน) เชปไฟล์http://www.nceas.ucsb.edu/scicomp/usecases/ReadWriteESRIShapeFiles โครงการ R-เชิงพื้นที่อาจจะยังน่าสนใจสำหรับคุณhttp://cran.r-project.org/web/packages/sp/index.html


17

คุณสามารถใช้sfห้องสมุดเพื่อเปิดshapefilesRโดยตรงใน มันเร็วกว่าrgdalห้องสมุดตรวจสอบที่นี่: คุณสมบัติที่เรียบง่ายสำหรับ R - มาตรฐาน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับsfแพคเกจตรวจสอบที่หน้าแรกของโครงการR-เชิงพื้นที่

# Load library
library('sf')

# Load shapefile
shapename <- read_sf('~/path/to/file.shp')

11

ทางออกที่ง่ายในปี 2560 คือshapefile()ฟังก์ชั่นในrasterห้องสมุด

#Load library
library(raster)

#Load shapefile
shp <- shapefile("myshapefile")

UPDATE:นี่ยังคงเป็นตัวเลือกที่ดีในปี 2562


สามารถใช้เพื่อนำเข้าจากแหล่งข้อมูลออนไลน์ได้หรือไม่ I
I Del Toro

@IDelToro ไม่โดยตรง คุณจะต้องดาวน์โหลดลงในฮาร์ดไดรฟ์ของคุณก่อนแล้วจึงโหลดจากที่นั่น
คริสโตเฟอร์

6

อีกทางเลือกหนึ่งคือการใช้ห้องสมุดfastshpซึ่งมี ::

รูทีนสำหรับการจัดการรูปร่าง ESRI ที่มีขนาดใหญ่ (.shp) ซึ่งรวมถึงการอ่านการทำให้ผอมบางจุดและการจับคู่จุดกับรูปร่างที่มี เป้าหมายหลักของแพ็คเกจนี้คือการให้ความเร็วในการรองรับไฟล์รูปร่างขนาดใหญ่ (ล้านคะแนน) มันเป็นคำสั่งของ maginute หลายคำที่เร็วกว่าแพ็กเกจ shapefile อื่น ๆ

นี่คือคำถามของฉันเกี่ยวกับ SE เกี่ยวกับวิธีใช้กับ ggplot2:

ฉันจะพล็อต Shapefile ที่โหลดผ่าน fastshp ใน ggplot2 ได้อย่างไร


1
ฉันคิดว่ามันน่ารำคาญเล็กน้อยที่ฟังก์ชั่น read.shp ไม่ได้ส่งผลให้วัตถุ sp เนื่องจากชุมชน R เชิงพื้นที่กำลังมาบรรจบกันในเรื่องนี้ตามมาตรฐานพฤตินัยสำหรับการจัดการวัตถุอวกาศฉันพบว่าสิ่งนี้ค่อนข้างเลอะเทอะ เนื่องจาก RAM ที่เพียงพอและระบบปฏิบัติการ 64 บิตการอ่านข้อมูลขนาดใหญ่ไม่ใช่ปัญหา ด้วย 8GB RAM ฉันได้อ่านคะแนน 30M และรูปหลายเหลี่ยม 2.5M โดยใช้ rgdal โดยไม่มีปัญหา นี่คือทิศทางในการใช้วัตถุ sp ด้วย ggplot2: github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Jeffrey Evans
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.