Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Mon 15 December 2014 15:06

Mlecoeuvre
Participant occasionnel
Date d'inscription: 22 Apr 2013
Messages: 19

Arcgis 10.2 - conserver la géometrie qui à la plus grande surface

Bonjour,
Je recherche quelque chose de tous bête et pourtant impossible d'avoir une idée sur comment faire.

Initialement je cherche à récupérer les parcelles qui ont un bâti superposée dessus.
Pour cela, j'étais parti sur l'idée de faire une jointure spatiale qui ne conserve que les parcelles qui contiennent un bati.
Sauf qu'il peut arriver que la parcelle ne contienne pas entièrement le bati. Il peut aussi arriver qu'un bati intersecte une parcelle mais que cela vienne d'un décalage ou autre.

Je suis donc parti sur l'idée d'intersecter mes bati avec mes parcelles, ne conserver que mon bati qui à la surface max puis récupérer les parcelles qui intersecte ma sélection de bati.

Pour un bâtiment intersectant 3 parcelles = 3 intersection je ne garde que le batiment ayant la surface la plus grande.
num_bati surface
1             0.3
1             2
1             1.5
2             0.7

obtenir
num_bati surface
1             2
2             0.7

Quelqu'un aurait une idée de comment faire?
Soit avec des options déjà existantes, soit en faisant plusieurs étape?

Je suis sur arcview.

Merci d'avance

Dernière modification par Mlecoeuvre (Mon 15 December 2014 15:09)

Hors ligne

 

#2 Mon 09 March 2015 15:54

Nicolas Granier
Participant assidu
Date d'inscription: 19 Apr 2007
Messages: 271

Re: Arcgis 10.2 - conserver la géometrie qui à la plus grande surface

Bonjour,
je sais que le post date un peu mais j'ai profité de l'absence de réponse pour faire de cette problématique (courante) un exercice aux étudiants de la licence Pro GGAT de Auch.
J'ai quelque peu simplifié l'énoncé pour le rendre plus clair. On a des bâtis dans des parcelles (pas de bâti à cheval ou alors déjà découpé). Chaque bâti est identifié par un identifiant -champ BATI_ID et chaque bâti porte l'identifiant de la parcelle dans laquelle il se trouve - PARCEL_ID.

Voici le script python qui permet de mettre à jour un champ en désignant le bâti de plus grande surface dans chaque parcelle

Code:

#-*- coding:Latin-1 -*-
import arcpy
bati=r"F:\COURS_GGAT_2014\TP\TP5_Arcgis3\exo1\bati.shp"

#le champ MAX_SURF est créé manuellement en entier court dans la table de bâti
#il sera mit à la valeur "1" par le script pour identifier les bâti de surface maximale



#fonction qui permet pour des bati sur la même pacelle de renvoyer l'id du bati le plus grand
def ChercheIdMax(couche,surf) :
    table2=arcpy.SearchCursor(couche)
    maxAire=-1 
    for ligne2 in table2:
        idbat=ligne2.getValue("BATI_ID")
        aire = ligne2.getValue(surf)
        if aire>=maxAire:
            maxAire=aire
            maxId=idbat
    return maxId

table=arcpy.SearchCursor(bati)
listParcelle=[]
compteur=0
for ligne in table:
    code_parcelle=ligne.getValue("PARCEL_ID") #on recupère l'id de la parcelle à partir d'un bati
    if code_parcelle not in listParcelle: #si on a déjà traité un bati de cette parcelle on passe
        compteur+=1
        listParcelle.append(code_parcelle)
        print str(compteur) + " : " + code_parcelle
        code_bati=ligne.getValue("BATI_ID")
        #selection des lignes ayant le meme code parcelle
        arcpy.MakeFeatureLayer_management(bati,"bat")
        arcpy.SelectLayerByAttribute_management("bat","NEW_SELECTION","PARCEL_ID='"+code_parcelle+"'")
        #on passe une fonction qui renvoie l'id du bati qui a la valeur max
        id =ChercheIdMax("bat","SURFACE")
        #on selectionne le bati avec l'i max
        arcpy.SelectLayerByAttribute_management("bat","NEW_SELECTION","BATI_ID='"+id+"'")
        #on calcule le champ MAX_SURF pour mettre sa valeur à 1
        arcpy.CalculateField_management("bat","MAX_SURF","1")
        arcpy.Delete_management("bat")

Hors ligne

 

#3 Mon 09 March 2015 16:15

Nicolas Granier
Participant assidu
Date d'inscription: 19 Apr 2007
Messages: 271

Re: Arcgis 10.2 - conserver la géometrie qui à la plus grande surface

il existe aussi une solution plus simple mais que je n'approuve guère lorsque l'on travaille sur des valeurs numériques.
La méthode est la suivante :
- on crée un champ texte qui va concaténer l'id de la parcelle (contenu dans la table attributaire de l'objet bati) avec la surface du bâti.
On obtient donc une valeur qui ressemble à cela "PARCELLE004_25.65"
- on fait un récapituler sur le champ de l'identifiant de la parcelle en prenant le max de la valeur du champ surface
Ainsi si l'on a 3 bâtis comme ceci :
ID BATI    ID PARCELLE    SURFACE
BAT006     PARCELLE004    12.2
BAT008     PARCELLE004      8.3
BAT009     PARCELLE004    25.65

On obtient dans le recap une seule ligne
ID PARCELLE    SURFACE_MAX
PARCELLE004    25.65

- il ne reste plus qu'à faire à nouveau un champ de concaténation dans le dbf de récap pour associer la parcelle avec la valeur MAX de l'aire
- on termine avec une jointure entre le fichier de bâti et le fichier de récap sur les champs de concaténation

A+

Hors ligne

 

Pied de page des forums

Powered by FluxBB