Scegliere il valore corretto per proj4string per la lettura dello shapefile in R?


14

Sto avendo uno shapefile di poligoni e un altro file CSV che contiene un elenco di punti come coppie (Lat, Lng) ..

Voglio controllare per ogni coppia (lat, lng) dal file CSV quale poligono rientra all'interno.

Lo shapefile viene proiettato e il file proj è così:

PROJCS["Transverse_Mercator",GEOGCS["GCS_OSGB 1936",
DATUM["D_OSGB_1936",SPHEROID["Airy_1830",6377563.396,299.3249646]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",-2],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000],PARAMETER["false_northing",-100000],UNIT["Meter",1]]

Il mio piano è il seguente:

  1. Leggi lo shapefile usando la readShapePolyfunzione nel MapToolspacchetto R.
  2. Leggi le coordinate dei punti dal file CSV in un frame di dati e convertilo in SpatialPointsDataFrame
  3. Usa la overfunzione per determinare in quale poligono cade dentro.

Per fare ciò, devo specificare proj4stringdurante il caricamento dello shapefile nel passaggio 1 e anche trasformare le coordinate dal file CSV nello stesso sistema di proiezione usando la spTransformfunzione prima di applicare la overfunzione nel passaggio 3 poiché richiede che i punti e i poligoni debbano essere sotto lo stesso sistema di proiezione.

Qualche idea su quale dovrebbe essere il valore corretto per il contenuto del file proj mostrato sopra?


Se i tuoi file di forma hanno già la proiezione definita, usa "readOGR" nel pacchetto rgdal. Questo pacchetto è un wrapper per GDAL e sostituisce davvero la funzionalità di lettura / scrittura dello shapefile nei maptools. Questa funzione gestisce tutti i tipi di topologia e conserva le informazioni di proiezione.
Jeffrey Evans,

Quando provo a caricare il file di forma usando la readOGRfunzione ottengo sempre Impossibile aprire l' errore del file
Moustafa Alzantot,

OK, ora sono stato in grado di leggere il file usando readOGR .. usando la summaryfunzione per l' SpatialPolygonDataFrameoggetto mi ha dato il valore corretto perproj4string
Moustafa Alzantot

Bene, senza dettagli su come stai usando la funzione è difficile aiutarti! Parte della sintassi è la directory in cui risiedono i dati e non è necessaria l'estensione .shp nel nome file. Qualcosa come readOGR (getwd (), "YourShape") dovrebbe funzionare se hai la directory di lavoro impostata nello stesso posto in cui si trova il tuo file.
Jeffrey Evans,

Grazie @JeffreyEvans, ora ha funzionato e l'ho usato per ottenere il proj4string
Moustafa Alzantot,

Risposte:


14

Proj4string è una stringa crs PROJ4 valida .

vedi Come posso ottenere la stringa proj4 o il codice EPSG da un file .prj shapefile? e Shapefile PRJ alla tabella di ricerca SRID PostGIS?

in breve:

  • Puoi usare gdalinfo come nel primo riferimento o le associazioni GDAL Python come nel secondo riferimento.

O

  • vai a Prj2EPSG (un semplice servizio per convertire note informazioni di proiezione di testo da file .prj in codici EPSG standard)
  • Inserisci il contenuto del tuo file prj

inserisci qui la descrizione dell'immagine

  • il risultato è EPSG: 27700 quindi una prima versione della stringa PROJ4 è

    " + init = epsg: 27700 "

`O

inserisci qui la descrizione dell'immagine

  • fai clic su Proj4 e la stringa PROJ4 completa è:

    " + proj = tmerc + lat_0 = 49 + lon_0 = -2 + k = 0.9996012717 + x_0 = 400000 + y_0 = -100000 + ellps = arioso + datum = OSGB36 + unità = m + no_defs "


10

Ecco un sito Web molto utile per recuperare il codice EPSG per una determinata proiezione. Nel tuo caso la proiezione è "EPSG: 27700". Se sono state definite proiezioni per il file di forma, è possibile assegnare la proiezione quando si crea SpatialPointsDataFrame e quindi utilizzare la definizione di proiezione dal file di forma importato. L'uso di "readOGR" dal pacchetto rgdal manterrà le definizioni di proiezione. Ecco un esempio di assegnazione e estrazione di stringhe di coordinate sui dati della classe sp.

require(sp)
require(rgdal)

# Use meuse dataset
data(meuse)

# Coerce into SpatialPointsDataframe
coordinates(meuse) <- ~x+y

# Assign projection
proj4string(meuse) <- CRS("+init=epsg:28992")

# Pull some observations and transform to Lat/Long
meuse.geo <- meuse[sample(dim(meuse)[1],10),]
  prj.LatLong <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84")
    meuse.geo <- spTransform(meuse.geo, prj.LatLong)

# Pull projection string from meuse.geo and use in spTransform
#   to reproject meuse to lat/long  
( prj <- proj4string(meuse.geo) )   
meuse <- spTransform(meuse, CRS(prj))   
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.