Suite

Créer la meilleure ligne d'ajustement à partir de données ponctuelles à l'aide d'ArcGIS for Desktop ?


J'ai des points GPS qui montrent les emplacements des bulles de surface d'une plongée de recherche le long d'un transect. Le vent, les vagues et les courants ont conspiré pour ajouter des erreurs à ces données. Je souhaite créer une seule ligne de meilleur ajustement à partir des points surlignés en bleu dans l'image ci-jointe à l'aide d'ArcGIS 10.3, mais je ne sais pas comment le faire.


Malheureusement, la solution de Farid Cher utilise une analyse de régression. Il minimise soit (distance X)^2 à la ligne, soit (distance Y)^2, en fonction des valeurs sélectionnées pour l'axe Y. Il semble que vous voudriez minimiser la distance entre la ligne et les points.

Une solution complète peut être trouvée ici: https://math.stackexchange.com/questions/839464/how-to-find-a-line-that-minimizes-the-average-squared-perpendicular-distance-fro mais c'est trop effort.

Une solution approximative peut être obtenue en utilisant la moyenne des droites de régression XY et de régression YX.

Essayez ce script :

import arcpy, traceback, os, sys import numpy as np try: def showPyMessage(): arcpy.AddMessage(str(time.ctime()) + " - " + message) mxd = arcpy.mapping.MapDocument("CURRENT") points = arcpy.mapping.ListLayers(mxd,"points")[0] plines = arcpy.mapping.ListLayers(mxd,"lines")[0] g=arcpy.Geometry() geometryList=arcpy.CopyFeatures_management(points,g ) geometryList=[p.firstPoint pour p dans geometryList] SX,SY,SX2,SXY,SY2=0,0,0,0,0,0 minX=geometryList[0].X maX=minX N=len(geometryList) pour p dans la liste de géométrie : SX+=pX;SX2+=pX*pX;SY+=pY;SXY+=pX*pY;SY2+=pY*pY si pXmaX:maX=pX # y régression A=np.array([[SX,N],[SX2,SX]]) B=np.array([SY,SXY]) (a,c)=np.linalg. solve(A,B) # X régression A=np.array([[SY,N],[SY2,SY]]) B=np.array([SX,SXY]) (A,C)=np.linalg .solve(A,B) a=(a+1/A)/2 c=(cC/A)/2 p1=arcpy.Point(minX,a*minX+c) arr=arcpy.Array(p1) p2 =arcpy.Point(maX,a*maX+c) arr.add(p2) pLine=arcpy.Polyline(arr) curT = arcpy.da.InsertCursor(plines,"[email protected]") curT.insertRow((pLine,) ) del mxd sauf : message = "
*** ERREURS PYTHON *** " ; showPyMessage() message = "Informations de suivi Python : " + traceback.format_tb(sys.exc_info()[2])[0] ; showPyMessage() message = "Informations d'erreur Python : " + str(sys.exc_type)+ " : " + str(sys.exc_value) + "
" ; showPyMessage()

Notez que le script fonctionnera sur la sélection.

Dans l'exemple illustré, la distance moyenne jusqu'à la ligne de régression Y était de 444 m, la distance jusqu'à la « ligne Min » était de 421 m


Cela n'est pas possible avec les outils intégrés d'ArcGis pour tracer une ligne de régression adaptée à vos entités ponctuelles géographiquement.

Au lieu de cela, vous devriez utiliser Graphique outil pour créer une droite de régression.

  1. Utilisez "Ajouter des coordonnées XY (Gestion des données)" pour ajouter des champs de coordonnées X et Y.

  2. Sélectionnez vos fonctionnalités (comme vous l'avez déjà fait)

  3. Utilisez le menu Affichage > Graphiques > Créer des graphiques.

  4. Remplissez les paramètres (sélectionnez les champs de coordonnées X, Y) puis ajoutez une nouvelle fonction de type pente


FélixIP, merci ! C'était génial! Ça a marché comme sur des roulettes. J'ai codé une régression polynomiale pour ArcGIS (pas aussi élégante que la vôtre… mon code ci-dessous). Il y avait une légère différence dans la ligne.

essayez : "Cet outil prendra une classe d'entités de points et créera une ligne de meilleur ajustement basée sur une régression polynomiale des valeurs x et y. Cet outil ne fonctionne que sur les jeux de données projetés. La ligne de régression de sortie sera coupée à un cercle de délimitation minimum autour des points.Cet outil a été développé et testé avec un ArcGIS 10.3 avec Python 2.7 Cet outil fonctionnera avec une licence de niveau ESRI Basic."import sys, traceback print "go" import arcpy, numpy arcpy.env.overwriteOutput = True #Définissez vos chemins de données ici… inFC = r"C:gTempdivetract.shp" outFC = r"C:gTempaaaregressionline.shp" outFCmbg = r"in_memoryoutFCmbg" regressionline = r"in_memory
egressionlinetemp" arcpy.MinimumBoundingGeometry_management(inFC, outFCmbg, "CIRCLE", "ALL", "", "NO_MBG_FIELDS") desc = arcpy.Describe(outFCmbg) extent = desc.extent XMin = extend.XMin YMin = extent.YMin XMax = extent. XMax YMax = extend.YMax array = arcpy.da.FeatureClassToNumPyArray(inFC, ["[email protected]"]) x = [] y = [] pour l'élément du tableau : x.append (item[0][0]) y.append(item[0][1]) regression = numpy.polyfit(x, y, 1) m = float(regression[0]) b = float(regression[1] ) x1 = (YMin-b)/m x2 = (YMax-b)/m feature_info = [[x1, YMin], [x2,YMax]] lineArray = arcpy.Array() pour x,y dans feature_info : lineArray. add(arcpy.Point(x,y)) lineArray.add(lineArray.getObject(0)) features = arcpy.Polyline(lineArray) arcpy.CopyFeatures_management(features, regressionline) arcpy.Clip_analysis(regressionline, outFCmbg, outFC) print " Terminé sans erreurs !" sauf : tb = sys.exc_info()[2] tbinfo = traceback.format_tb(tb)[0] pymsg = " ERREURS PYTHON :
Informations de traçabilité :
" + tbinfo + "
Info erreur :
" + str( sys.exc_info()[1]) msgs = "ArcPy ERRORS:
" + arcpy.GetMessages(2) + "
" arcpy.AddError(pymsg) arcpy.AddError(msgs) print pymsg + "
" print messages

Si vous voulez une approximation rapide, vous pouvez créer votre propre ligne en ajoutant une entité segment en plaçant deux sommets sur la carte qui correspondent au début et à la fin de vos transects. Ensuite, examinez les coordonnées des sommets, soit avec le bouton Information (i dans un cercle) soit en regardant plus profondément dans la table des sommets. Avec les coordonnées de début et de fin, vous pouvez calculer la pente de la ligne et son intersection.

Cela fonctionne mieux lorsque vous créez des lignes à des fins d'affichage et peut être plus rapide que de le déterminer avec précision si vous avez <50 lignes, mais si vous êtes intéressé à le faire pour des centaines de lignes, une approche plus automatisée serait préférable.


Voir la vidéo: Le traitement dune enquête à laide dExcel - 1. La construction de la base de réponses (Octobre 2021).