Pages: 1
- Sujet précédent - Arcgis 10.2 - conserver la géometrie qui à la plus grande surface - Sujet suivant
#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
Pages: 1
- Sujet précédent - Arcgis 10.2 - conserver la géometrie qui à la plus grande surface - Sujet suivant