[R] adjusting the map of France to 1830

Stephane DRAY dray at biomserv.univ-lyon1.fr
Fri Nov 19 01:24:21 CET 2004


At 19:07 18/11/2004, Ray Brownrigg wrote:
>At 16:29 18/11/2004, Michael Friendly wrote:
> > I'm doing some analyses of historical data from France in 1830 on 'moral
> > statistics' that I'd like to
> > show on a map.  I've done most of my analyses in SAS, but a few things
> > would work better in R.
> > To do this, I have to adjust the modern map,
> >
> > library(maps)
> > map('france')
> >
> > to adjust for changes in departments (86 in 1830, to 97 now).  I've read
> > the documentation
> > for the maps and maptools package, but there seems to be no functions to
> > allow this, and
> > I can't find information on the exact structure of map datasets, but I
> > understand them to
> > be delimited lists of polygon coordinates.
> >
> > In SAS, all maps have (one or more) ID variables representing the
> > geographical region,
> > and there is also a proc gremove that can remove internal boundaries
> > inside the polygons
> > for regions with the same ID.  Is there some way I can do this in R?
> >
>Unfortunately not with the current implementation of several of the
>'extra' databases in the mapdata package.  The map() function does have
>the interior=FALSE option, which would normally do what you want, but
>only when the data has been manipulated to allow it.  Currently this
>option is only useful with the world and usa maps (and their
>derivatives, such as world2 and state).
>
>Currently every department is a complete polygon, and so every interior
>line segment occurs twice in the data.  What has to happen to the data
>is for it to be split up into non-overlapping line segments, and each
>polygon reconstructed from a list of these line segments (with
>direction being important).

There is the gpclib package which computes intersection, union... of 
polygons. I have try to play with its union function and the france data, 
but the results are good but a little bit complicate:
# i merge the two firts polygons:

 > departements=map('france')
 > which(is.na(departements$x))[1:2]
   [1]   66  122
 > gpcA <- as(cbind(departements$x[1:65],departements$y[1:65]),"gpc.poly")
 > gpcB <- as(cbind(departements$x[67:121],departements$y[67:121]),"gpc.poly")
 > union(gpcA,gpcB)
GPC Polygon
    Num. Contours:  1
    Num. Vertices:  74
    BBox (X):  1.563161 --> 4.225965
    BBox (Y):  49.97212 --> 51.09752
 > gpcAB<-union(gpcA,gpcB)


 > 
departements$x=c(attr(gpcAB,"pts")[[1]]$x,attr(gpcAB,"pts")[[1]]$x[1],departements$x[-(1:121)])
 > 
departements$y=c(attr(gpcAB,"pts")[[1]]$y,,attr(gpcAB,"pts")[[1]]$y[1],departements$y[-(1:121)])
 > map(departements)


Another solution is to do the job in a GIS and to import the new map with 
maptools.

The package gpclib is very intersting and I think that it can be used to 
develop some basic GIS tools. I have write a functions to compute 
intersections for objects of class polys easily.

The only thing is to know for which class of spatial objects these 
functions must be developed !



Stéphane DRAY
-------------------------------------------------------------------------------------------------- 

Département des Sciences Biologiques
Université de Montréal, C.P. 6128, succursale centre-ville
Montréal, Québec H3C 3J7, Canada

Tel : (514) 343-6111 poste 1233         Fax : (514) 343-2293
E-mail : stephane.dray at umontreal.ca
-------------------------------------------------------------------------------------------------- 

Web                                          http://www.steph280.freesurf.fr/




More information about the R-help mailing list