2013-11-20 4 views
4

Французский национальный институт (Insee) предоставляет географические данные в формате MapInfo (два файла .mid и .mif и один файл dbf). Как я могу прочитать эти файлы в R?Как читать файлы Mapinfo в R

Адрес example.

ответ

7

Существует OGR-драйвер для MapInfo файлов (пакет rgdal):

R> library("rgdal") 
R> ogrDrivers()[28, ] 
      name write 
28 MapInfo File TRUE 

Но есть проблема с файлами/геометрией, readOGR выдает сообщение об ошибке:

R> ogrListLayers("R02_rfl09_UTM20N1000.mid") 
[1] "R02_rfl09_UTM20N1000" 

R> readOGR("R02_rfl09_UTM20N1000.mid", layer="R02_rfl09_UTM20N1000") 
OGR data source with driver: MapInfo File 
Source: "R02_rfl09_UTM20N1000.mid", layer: "R02_rfl09_UTM20N1000" 
with 967 features and 4 fields 
Feature type: wkbPolygon with 2 dimensions 
Error in stopifnot(is.list(srl)) : ring not closed 

Однако , Я смог прочитать файлы с GRASS GIS, которые могут быть написаны с использованием R (пакет spgrass6):

v.in.ogr dsn=R02_rfl09_UTM20N1000.mid output=R02_rfl09_UTM20N1000 snap=1e-08 

GRASS screenshot

+0

У меня такая же ошибка, как и вы: 'Ошибка в stopifnot (is.list (srl)) 'и я не могу использовать данные, которые я загрузил с помощью' readOGR'. Спасибо за ваше решение. – PAC

5

Сложно сказать, потому что ваш pdf-файл определяет только структуру .mid.

Это зависит от того, что вы хотите делать с датой, но, глядя на нее, файл .mid имеет SW-координаты каждой области и проверяет файл .mif, каждая область составляет 1000 м2, поэтому вы можете просто calcuate области (для этой выборки данных), а не загружать их в.

Так вот один из способов загрузки его, но это будет зависеть от того, что вы хотите делать с данными

сначала скопировать. csv в ваш рабочий каталог, затем

coords<-read.csv(file="R02_rfl09_UTM20N1000.mid", header=FALSE) 
colnames(coords)<-c("SW.E","SW.N","ind","indXYNE1") 
# add the co-ords for the area 
coords$SE.N=coords$SW.N 
coords$SE.E=coords$SW.E+1000 
coords$NW.N=coords$SW.N+1000 
coords$NW.E=coords$SW.E 
coords$NE.N=coords$SW.N+1000 
coords$NE.E=coords$SW.E+1000 

head(coords) 

Это даст Вы:

SW.E SW.N ind indXYNE1 SE.N SE.E NW.N NW.E NE.N NE.E 
1 690000 1636000 241  6 1636000 691000 1637000 690000 1637000 691000 
2 690000 1637000 414  3 1637000 691000 1638000 690000 1638000 691000 
3 690000 1638000 240  6 1638000 691000 1639000 690000 1639000 691000 
4 690000 1640000 8  0 1640000 691000 1641000 690000 1641000 691000 
5 691000 1634000 142  0 1634000 692000 1635000 691000 1635000 692000 
6 691000 1635000 216  5 1635000 692000 1636000 691000 1636000 692000 
.... 

который четыре граничных точек каждой области, плюс IND и indXYNE1, которые я предполагаю, что вы ищете? Затем вы можете преобразовать данные с помощью точки SW (или нового производного ключа) в качестве ссылки для каждой области.

Надеюсь, что это поможет! Зависит немного от того, что вы хотите делать с данными.

+0

Да, это так. Вот немного сущности, чтобы показать суть этого - включая все детские шаги, в хорошем чистом коде: https://gist.github.com/Robinlovelace/29d387f6b48fd9bf9d2d – RobinLovelace