Bonjour,

Je possède un polygone dans lequel je cherche à créer des transects de manière aléatoire. Je passe par R car sous Qgis ce n'est pas possible.
Je souhaite tracer 10 transects dans ma zone.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
library(rgdal)
# Lecture de la couche shape
pol <- readOGR("E:/Stage_2015_QGIS/Echantillonnage_Sissonne/Anemone_sauvage/Echantillonnage_2015/Polygones_emprise _pop", "Polygone_emprise_ech-tampon")
 
# afficher la projection de la couche
print(proj4string(pol))
# [1] "+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs"
 
# Génerer la visualisation de la couche
plot(pol, axes=TRUE, border="black")
# Récupérer les données spatiales
maxXY <- bbox(pol)[, 2]
minXY <- bbox(pol)[, 1]
plot(pol, xlim = c(minXY[1], maxXY[1]), ylim = c(minXY[2], maxXY[2]))
C=cbind(maxXY,minXY)
 
library(spatstat)
# Définition du polygoe, de la longueur des transects et du nombre de transects (points)
data("C")
mywindow <- pol
ltransect <- 200
npoints <- 10
s<- 1:npoints
 
# Génerer des points aléatoire dans la zone
cosa <- runifpoint(npoints, mywindow)
plot(cosa,title="")
 
#Dataframe avec les coordonnées de chaque point
cosaxy <- data.frame(cosa$x,cosa$y)
 
# Calcul d'un cercle autour de chaque point de la longueur du transect
cosadisc<- apply(cosaxy,1, function(x) disc(r=ltransect, x))
 
# Verifier que les cercles sont bien à l'interieur du polygone
cosadisc.df <- lapply(cosadisc, function(W){
  inside.owin(W$bdry[[1]]$x,W$bdry[[1]]$y 
              ,w=mywindow)})
 
#Fonction pour échantillonner chacun des cercles de points dans le polygone 
#(en fonction de la longueur du transect et de l'inclusion dans le polygone)
samplea2 <- function(cosaxy, l1=cosadisc, l2=cosadisc.df){
  result<-c(0,0)
  for (i in 1:length(l1)){
    truinside<-sum(l2[[i]])
    inside <-cbind(l1[[i]]$bdry[[1]]$x,l1[[i]]$bdry[[1]]$y)[l2[[i]],]
    result<-rbind(result,  inside[sample(1:truinside, size=1),])
  }
  result<-result[-1,]
  result<-cbind(cosaxy,result)
  return(result)
}
 
#Le résultat est une matrice avec coordonnées de chaque transect (x0/y0 et x1/y1)
 
#Afficher dans un dataframe les résultats  de la fonction avec les coordonées des transects
segmentos<-samplea2(cosaxy)
 
#Dessin des transects aléatoire en prenant pour point de départ le point de coordonées x0/yo
segments(segmentos[,1], segmentos[,2],segmentos[,3], segmentos[,4])
 
#Extraction des coordonées des transect
write.table(segmentos[,c(1,2)], "Coord1.csv", row.names=FALSE, sep="\t",dec=",", na=" ")
write.table(segmentos[,c(3,4)], "Coord2.csv", row.names=FALSE, sep="\t",dec=",", na=" ")
En utilisant ce script (issu d'un forum, que j'ai arrangé à ma sauce), j'obtiens bien mes transects mais... je ne comprends pas leur disposition...

Pour visualisation :

J'ai bien mes points initiaux tirés au hasard et mes 10 transects. Cependant, quand j'applique la fonction qui créer un cercle à partir de mes points d'un rayon de longueur de mon transect, je pensais que je pouvais avoir plusieurs transects.
Y a t-il un angle prédéterminé pour tracer le transect à part d'un point ?

En vous remerciant,
Geoffroy