MASTER_GEOMATIQUE

View on GitHub

Créer une trace “GPS”

Vous devez réaliser le suivi fictif GPS de la divagation d’une araignée dans la salle de cours pendant 1 heure.

Les outputs attendus sont:

ID dateTime X Y speed
1 24112021 145633 381046 6557972  
2 24112021 145635 381048 6557985 6km/h
3 24112021 145637 381058 6557995 5km/h

Niveau 2. Vous devez ajouter des temps de pause et de la fatigue (diminution de la vitesse de déplacement). Ainsi vous pouvez calculer des statistiques telles que l’allure, la distance totale ou la durée totale des pauses.

Niveau 3. Vous pouvez ajouter des obstables. Cela nécessite de créer des objets spatialisés (points, polygones ou lignes) et de réaliser des géotraitements comme des zones tampons ou des intersections.

spider


###########################################################
###########################################################
####                      Package                      ####
###########################################################
###########################################################

# Import les packages
import sys # Pour les informations système
from osgeo import ogr, osr #Package pour lire et traiter un très grand nombre de format de donnees vectorielles
import os # Gestion des fichiers et des dossiers
import random

###########################################################
###########################################################
####                Repertoire courant                 ####
###########################################################
###########################################################

# Fixer le repertoire courant
os.chdir("/home/gilleol2/Bureau")

###########################################################
###########################################################
####                  Ouvrir shapefile                 ####
###########################################################
###########################################################

# Ouvrir le shapefile de notre zone d'etude 
DriverName = "ESRI Shapefile"      # e.g.: GeoJSON, ESRI Shapefile
FileName = "BATI_M2_TD.shp"
driver = ogr.GetDriverByName('ESRI Shapefile')
dataSource = driver.Open(FileName, 0) # 0 means read-only. 1 means writeable.

# Vérifier l'ouveture du shapefile
if dataSource is None:
    print('Could not open %s' % (FileName))
else:
    print('Opened %s' % (FileName))
    layer = dataSource.GetLayer()
    featureCount = layer.GetFeatureCount()
    print("Number of features in %s: %d" % (os.path.basename(FileName),featureCount))  

###########################################################
###########################################################
####              Initialiser la divagation            ####
###########################################################
###########################################################
    
# Obtenir l'extension spatiale de notre shapefile
extent = layer.GetExtent()
xmin, xmax, ymin, ymax = layer.GetExtent()

# Definir la position de départ de notre animal 
startX = random.uniform(xmin,xmax)
startY = random.uniform(ymin,ymax)

# Definir la vitesse de déplacement de l'araignée
# Araignée : 2 km/h
# speed = 2/3.6
distanceSpyder = 0.5

###########################################################
###########################################################
####                  Créer les outputs                ####
###########################################################
###########################################################

# Definir les noms pour les shapefiles
output_point = "points_GPS_animal.shp"
output_line = "line_GPS_animal.shp"

#Verifier si ils existent [Si oui, supprimer les fichiers)
if os.path.exists(output_point):
    driver.DeleteDataSource(output_point)
    
if os.path.exists(output_line):
    driver.DeleteDataSource(output_line)
    
# Creer les donnees avec la methode CreateDataSource
ds_point = driver.CreateDataSource(output_point)
ds_line = driver.CreateDataSource(output_line)

# Verifier la creation des donnees
if ds_point is None :
    print ('Could not create file ', ds_point)
    sys.exit (1)

if ds_line is None :
    print ('Could not create file ', ds_line)
    sys.exit (1)

# Importer le src depuis la librairie osr
spatialref = osr.SpatialReference()  # Fixe le scr
spatialref.ImportFromEPSG(2154)  # RGF93 aka ESPG:2154

# Creer la couche ou le layer avec la methode CreateLayer
layer_point = ds_point.CreateLayer('points_GPS_animal', spatialref, geom_type=ogr.wkbPoint)
layer_line = ds_line.CreateLayer('line_GPS_animal', spatialref, geom_type=ogr.wkbLineString)

#
# Points
###########################################################
###########################################################
# Ajouter un champ dans la table attributaire
# Definir l'attribut (FieldDefn)
fielddef = ogr.FieldDefn("X", ogr.OFTReal)
# Ajouter l'attribut a la table (CreateField)
layer_point.CreateField(fielddef)

# Ajouter un champ dans la table attributaire
# Definir l'attribut (FieldDefn)
fielddef = ogr.FieldDefn("Y", ogr.OFTReal)
# Ajouter l'attribut a la table (CreateField)
layer_point.CreateField(fielddef)

# Affiher les champs de la table attributairem on recupere les champs avec la methode GetLayerDefn
layer_ATTRIBUTS = layer_point.GetLayerDefn()
for i in range(layer_ATTRIBUTS.GetFieldCount()):
    print("Point - Field %d: %s" % ( i+1, layer_ATTRIBUTS.GetFieldDefn(i).GetName()))
###########################################################
###########################################################
#
#


#
# Line
###########################################################
###########################################################
# Ajouter un champ dans la table attributaire
# Definir l'attribut (FieldDefn)
fielddef = ogr.FieldDefn("id", ogr.OFTString)
# Ajouter l'attribut a la table (CreateField)
layer_line.CreateField(fielddef)

# Affiher les champs de la table attributairem on recupere les champs avec la methode GetLayerDefn
layer_ATTRIBUTS = layer_line.GetLayerDefn()
for i in range(layer_ATTRIBUTS.GetFieldCount()):
    print("Line - Field %d: %s" % ( i+1, layer_ATTRIBUTS.GetFieldDefn(i).GetName()))

# Créer l'entité
line = ogr.Geometry(ogr.wkbLineString)
###########################################################
###########################################################
#
#


###########################################################
###########################################################
####               Démarrer la divagation              ####
###########################################################
###########################################################

# Boucler pour parcourir le transect et écrire la données dans le shapefile
# Pour chaque ligne du de la colonne
for j in range(3600):
    
    direction = random.randint(0, 3)
    # 0 = up : 1 = down : 2 = left : 3 = right
    
    if direction == 0:
        if (startY + distanceSpyder)<ymax:
            startY = startY + distanceSpyder
    elif  direction == 1:   
        if (startY - distanceSpyder)>ymin:
            startY = startY - distanceSpyder
    elif  direction == 2:   
        if (startX - distanceSpyder)>xmin:
            startX = startX - distanceSpyder
    elif  direction == 3:   
        if (startX + distanceSpyder)<xmax:
            startX = startX + distanceSpyder
    
    #
    # Points
    ###########################################################
    ###########################################################
    # Créer l'entité
    point = ogr.Geometry(ogr.wkbPoint)
    # Fixer le point dans l'espace
    point.AddPoint(startX, startY)
    # Ajouter les attributs et contruire l'entité 
    featureDefn = layer_point.GetLayerDefn()
    feature = ogr.Feature(featureDefn)
    feature.SetGeometry(point)
    feature.SetField('X', startX)
    feature.SetField('Y', startY)
    layer_point.CreateFeature(feature)
    ###########################################################
    ###########################################################
    #
    #
    
    #
    # Line
    ###########################################################
    ###########################################################
    # Ajouter un point à notre ligne
    line.AddPoint(startX, startY)
    ###########################################################
    ###########################################################
    #
    #
    

#
# Line
###########################################################
###########################################################
# Ajouter les attributs et contruire l'entité 
featureDefn = layer_line.GetLayerDefn()
feature = ogr.Feature(featureDefn)
feature.SetGeometry(line)
feature.SetField('id', 1)
layer_line.CreateFeature(feature)
###########################################################
###########################################################
#
#

# Afficher le nombre d'entites
print('Le shapefile de points a: ' + str(layer_point.GetFeatureCount()) + ' entités')
print('Le shapefile de ligne a: ' + str(layer_line.GetFeatureCount()) + ' entités')

# Supprimer les fichier temporaires
del layer_point, layer_line, ds_point, ds_line