5 votos

La creación de la mejor línea de ajuste de punto de datos utilizando ArcGIS for Desktop?

He de puntos GPS de los que muestran las ubicaciones de la superficie de las burbujas de una investigación de buceo a lo largo de un transecto. El viento, las olas y las corrientes han conspirado error de agregar a estos datos. Quiero crear una mejor línea de ajuste de los puntos resaltados en azul en la imagen adjunta para el uso de ArcGIS 10.3, pero no sé cómo hacerlo.

enter image description here

4voto

FelixIP Puntos 4035

Por desgracia solución por Farid Cher utiliza el análisis de regresión. Minimiza (X-a distancia)^2 para la línea, o (Y distancia)^2, dependiendo de qué valores se han escogido para el eje Y. Parece que le gustaría para minimizar la distancia de la línea de puntos.

La solución completa se puede encontrar aquí: http://math.stackexchange.com/questions/839464/how-to-find-a-line-that-minimizes-the-average-squared-perpendicular-distance-fro pero es mucho esfuerzo.

Solución aproximada se puede lograr mediante el uso promedio de XY de regresión y YX líneas de regresión.

Probar este 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 for p in geometryList]
    SX,SY,SX2,SXY,SY2=0,0,0,0,0
    minX=geometryList[0].X
    maX=minX

    N=len(geometryList)
    for p in geometryList:
        SX+=p.X;SX2+=p.X*p.X;SY+=p.Y;SXY+=p.X*p.Y;SY2+=p.Y*p.Y
        if p.X<minX:minX=p.X
        if p.X>maX:maX=p.X
    # y regression
    A=np.array([[SX,N],[SX2,SX]])
    B=np.array([SY,SXY])
    (a,c)=np.linalg.solve(A,B)

    # X regression
    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=(c-C/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,"SHAPE@")
    curT.insertRow((pLine,))

    del mxd
except:
    message = "\n*** PYTHON ERRORS *** "; showPyMessage()
    message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
    message = "Python Error Info: " +  str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()

enter image description here

Nota, script funciona en la selección.

En el ejemplo que se muestra el promedio de la distancia de a Y línea de regresión fue de 444 m, distancia a la 'Min' línea fue de 421 m

2voto

Farid Cher Puntos 5306

Esto no es posible con ArcGis incorporado herramientas para dibujar una línea de regresión se ajuste a sus características de punto geográficamente.

En lugar usted debe utilizar el Gráfico de la herramienta para crear una línea de regresión.

  1. El uso de "Agregar Coordenadas XY (Gestión de Datos)" para agregar las coordenadas X e y de los campos.

  2. Seleccione su cuenta (como ya lo hizo)

  3. Utilice El Menú Vista > Gráficos > Crear Gráficos.

  4. Rellenar los parámetros (seleccione coordenadas X, Y de los campos) y, a continuación, agregue una nueva función de el tipo de pendiente

1voto

user1965813 Puntos 153

FelixIP, gracias! Eso fue genial! Él trabajó como un encanto. Hice un código de regresión polinomial para ArcGIS (no tan elegante como la tuya...mi código de abajo). Había una ligera diferencia en la línea.

try:
    '''This Tool will take a feature class of points and it will create a
    best fit line based on a polynomial regression of the x, and y values.
    This tool only works on projected datasets.  
    The output regression line will be clipped to a minimum bounding circle
    around the points.
    This tool was developed and tested with an ArcGIS 10.3 with Python 2.7
    This tool will work with an ESRI Basic level license.'''
    import sys,  traceback
    print "go"
    import arcpy, numpy
    arcpy.env.overwriteOutput = True

    #Set your data paths here....
    inFC = r"C:\gTemp\divetract.shp"
    outFC = r"C:\gTemp\aaaregressionline.shp"

    outFCmbg = r"in_memory\outFCmbg"
    regressionline = r"in_memory\regressionlinetemp"
    arcpy.MinimumBoundingGeometry_management(inFC, outFCmbg, "CIRCLE", "ALL", "", "NO_MBG_FIELDS")
    desc = arcpy.Describe(outFCmbg)
    extent = desc.extent
    XMin = extent.XMin
    YMin = extent.YMin
    XMax = extent.XMax
    YMax = extent.YMax
    array = arcpy.da.FeatureClassToNumPyArray(inFC, ["SHAPE@XY"]) 
    x = []
    y = []
    for item in array:
        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()
    for x,y in 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 "Finished Without Errors!"
except:
    tb = sys.exc_info()[2]
    tbinfo = traceback.format_tb(tb)[0]
    pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
    msgs = "ArcPy ERRORS:\n" + arcpy.GetMessages(2) + "\n"
    arcpy.AddError(pymsg)
    arcpy.AddError(msgs)
    print pymsg + "\n"
    print msgs

0voto

anonymous Puntos 6

Si desea una aproximación rápida, usted puede crear su propia línea por la adición de un segmento de la característica por la colocación de los dos vértices en el mapa que se corresponden con el inicio y el final de su transectos. A continuación, examine las coordenadas de los vértices, ya sea con el botón de Información (i en un círculo) o al mirar más profundamente en la tabla de vértices. Con el inicio y el final de las coordenadas, se puede calcular la pendiente de la recta y su intercepción.

Esto funciona mejor cuando usted está creando líneas para la visualización y puede ser más rápido que el de averiguar lo que ocurría con precisión si usted tiene menos de 50 líneas, pero si usted está interesado en hacer esto por cientos de líneas, un enfoque más automatizado sería mejor.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X