Message posté par : Pascal PLUVINET
----------------------------------------
Merci Thomas,
Cela m'a fait bien avancé.
En fait, je souhaitais mettre à jour un script R inspiré de
https://rdrr.io/github/PascalIrz/tod/man/ign_urba_tod.html
Voici le script mis à jour. Ce n'ai pas toujours très élégant mais ca fonctionne !
-----------------
Code :
library(dplyr)
library(stringr)
library(curl)
library(zip)
#############################
######PARAMETRES ############
#############################
###EMPRISE en WGS 84
XMIN<-4.498
YMIN<-44.764
XMAX<-5.228
YMAX<-45.27
#####Répertoire où on dépose les données
REP_OUTPUT<-"C:/MONSCHEMIN/"
#Chemin QGIS - pour deuxième partie où on fusionne les shapefile avec ogr2ogr
BINQGIS<-'C:/OSGeo4W/bin/'
Sys.setenv(PROJ_LIB="C:/OSGeo4W//share/proj")
#####Couches de données à récupérer
COUCHES_A_RECUP<-c("zone_urba","secteur_cc","prescription_lin","prescription_pct","prescription_surf","info_lin","info_pct","habillage_surf")
##########################################################
###FONCTION RECUPERANT LES SHAPEFILES EN FONCTION DE L'EMPRISE
##########################################################
ign_urba_tod <- function(couche,
ymin, xmin, ymax, xmax,
index_debut = 0, nb_elements_par_telech = 4999,
n_tot_elements_a_telech = 1e6, repertoire = NA)
{
url_base_1 <-
"https://data.geopf.fr/wfs/wfs?SERVICE=WFS&REQUEST=GetFeature&VERSION=2.0.0&TYPENAMES=wfs_du:"
url_base_2 <- "&SRSNAME=urn:ogc:def:crs:EPSG::2154"
url_base_3 <- "&BBOX="
url_base_4 <- "urn:ogc:def:crs:EPSG::4326&sortBy=gid&STARTINDEX="
url_base_5 <- "&COUNT="
url_base_6 <- "&outputformat=SHAPE-ZIP"
# Répertoire de stockage des données. S'il n'est pas spécifié, il est nommé
d'après la couche et éventuellement créé
if(is.na(repertoire))
{
repertoire <- paste0("raw_data/", couche)
}
if(dir.exists(repertoire) == FALSE) dir.create(repertoire)
# Création de vecteurs contenant autant d'éléments qu'il y aura de paquets à
télécharger
startindexes <- seq(from = index_debut,
to = n_tot_elements_a_telech,
by = nb_elements_par_telech) %>%
format(scientific = FALSE) %>%
str_trim(side = "both") # nettoyage des espaces qui traînent
requetes <- paste0(url_base_1, couche,
url_base_2,
url_base_3, ymin, ",", xmin, ",", ymax,
",", xmax, ",",
url_base_4, startindexes,
url_base_5, nb_elements_par_telech,
url_base_6)
indices <- 1:length(requetes)
chemins <- paste0(repertoire, "/",couche,"_", indices,
".zip")
# Boucle sur les batch
for(i in indices[1:length(indices)]) {
print(requetes)
curl_download(url = requetes, destfile = chemins)
if(file.size(chemins) < 1e5) break # interruption si l'on commence à
télécharger des fichiers vides
}
flush.console()
}
##################
###TRAITEMENT
#####################
#######################
### BLOUCLE SUR LES COUCHES A RECUPERER
for ( i in COUCHES_A_RECUP){
print(i)
ign_urba_tod(couche = i,
xmin = XMIN,
ymin = YMIN,
xmax = XMAX,
ymax = YMAX,
repertoire = REP_OUTPUT)
}
##### On supprime les ZIP trop petits et on extrait les plus grands
ZIP_FILES_PATH<-list.files(REP_OUTPUT, pattern = ".zip", full.names = TRUE)
for (i in ZIP_FILES_PATH) {
if(file.size(i) < 1e5){
unlink (i)
} else {
unzip(i, overwrite=TRUE ,
exdir=paste0(REP_OUTPUT,"/",gsub(".zip","",basename(i))))
unlink (i)
}
}
#Merge shapefile via ogr2ogr
for ( i in COUCHES_A_RECUP){
DIR_PATH<-list.files(REP_OUTPUT, pattern = i, full.names = TRUE)
for ( j in 1:length(DIR_PATH) ){
if (j==1){
FILESHP<-list.files(DIR_PATH[j], pattern = ".shp", full.names = TRUE)
if(length(FILESHP)>0){
SHPMERGED<-paste0(REP_OUTPUT,"/",i,".shp")
COMMAND<-paste0('"',BINQGIS,'ogr2ogr" -overwrite -t_srs
EPSG:2154 ','"',SHPMERGED,'"',"
",'"',FILESHP,'"')
system(COMMAND)
print(COMMAND)
flush.console()
}
} else {
FILESHP<-list.files(DIR_PATH[j], pattern = ".shp", full.names = TRUE)
if(length(FILESHP)>0){
NAMEnln<-gsub(".shp","",basename(SHPMERGED))
COMMAND<-paste0('"',BINQGIS,'ogr2ogr" -update -append -t_srs
EPSG:2154 ','"',SHPMERGED,'"',"
",'"',FILESHP,'" -nln ',NAMEnln)
system(COMMAND)
print(COMMAND)
flush.console()
}
}
}
}
-----------------
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=366944#p366944
Pour y répondre : donnees(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net