3 votos

¿Se puede rellenar automáticamente un nuevo punto con datos del polígono que contiene?

Necesito ayuda para crear un script.

Imagina que estoy usando 3 formas: 1 punto y 2 polígonos. Cuando creo un nuevo punto, quiero que asuma algunos atributos de los polígonos en los que se inserta ese punto.

¿Alguna idea?

4voto

mleykamp Puntos 491

El bucle a través de sus puntos (búsqueda cursor), luego pase a pesar de que los polígonos (búsqueda de cursor). Una vez que encuentre el punto está en el polígono (polígono.contiene(punto), entonces, como ustedes ya están en el registro del polígono y el punto, acabo de actualizar al establecer el atributo en el punto, al igual que el atributo que requieren de un polígono. simplemente, a continuación, actualizar la fila en la tabla de puntos, la salida del polígono de bucle, a continuación, cargar el siguiente punto, etc.

Si puedes esperar hasta el lunes, me pueden escribir algunas de arcpy para usted; es muy, muy fácil y yo creo que hizo lo mismo la semana pasada.

fcPnt = "C:\\Path\\to\\Point\\Data.sde\\PointDS"
fcPoly = "C:\\Path\\To\\Polygon\\Data.sde\\PolygonDS"
sSQL "Sql to sub select data for your points if you need to

pntcur = arcpy.UpdateCursor(fcPnt, sSQL)
# can also be pntcur = arcpy.SearchCursor(fcPnt) to select all points
for row in pntcur:
    #if you have access to the point x and y through column data, then use:
    geom = arcpy.Point(row.X,row.Y)
    #otherwise cast the shape to an arcpy point
    #geom = arcpy.Point(row.shape.extent.XMax,row.shape.extent.YMax)
    # or geom = arcpy.Point(row.GetPart()) as we know it is a point object, we dont need to reference the part number
    polycurs = arcpy.SearchCursor(fcPoly)
    for polyRow in polycurs:
        poly = polyRow.Shape
        if poly.contains(geom):
            row.SomeRow = polyRow.SomePolyRowData
            row.SomeOtherRow = polyRow.SomeOtherPolyRowData
            ...
            ...
        del polyRow
        del poly

    del polycurs
    pntcur.updateRow(row)
    del row

del pntcur

O no, o no abouts!

3voto

rkthkr Puntos 6651

Lo que estamos tratando de hacer es llamado un "punto en el polígono de búsqueda".

Python

Supongo que usted está tratando de secuencia de comandos usando python dado su etiqueta. Una búsqueda en google para python "point in polygon" debe dar un buen comienzo. Un primer resultado que se obtiene es esta página que parece que puede ser adaptable a hacer lo que quieres: http://www.heikkitoivonen.net/blog/2009/01/26/point-in-polygon-in-python/

Bases De Datos Espaciales

Alternativamente, usted puede descargar el procesamiento de una base de datos espaciales, es decir, spatialLite. Guarde sus polígonos en el allí y entonces cuando un nuevo punto de utilizar algunos de SQL para obtener los atributos de cualquiera de los polígonos su interior. https://code.google.com/p/xenia/wiki/SpatialLite - tiene un poco más de información

Bibliotecas De Python También hay algunos python SIG bibliotecas por ahí que podría permitir que usted para descargar a ellos en lugar de rodar sus propios. Por desgracia, yo no conozco a ninguno de sus nombres. :-S

1voto

Marc Puntos 230

No estoy seguro de que eso sea posible, o la mejor manera de abordar el problema. Me imagino que una mejor manera es crear todos los puntos primero, o cargarlos en su GIS de alguna manera, y luego actualizar los campos deseados en la forma de los puntos según el polígono en el que se encuentran, lo cual es muy posible en la mayoría de los programas de GIS, incluyendo fuente abierta.

Indique el software que desea utilizar si necesita más punteros.

1voto

Roy Puntos 2884

Qué tal si:

  1. Seleccione por ubicación -> punto (s) contenido por polígono.
  2. SearchCursor (polygonFeatureClass) -> almacena valores de atributos en
  3. variables Insert / UpdateCursor (pointFeatureClass) -> actualizar atributo con valores almacenados

0voto

Darren Puntos 738

En ArcGIS se puede utilizar simplemente de unión Espacial o de Identidad (ArcInfo sólo) para unir los atributos de una capa a otra. Ambas herramientas crear nueva capa de puntos.


Si no desea crear nueva capa y tener un mayor control sobre el método de selección, aquí está la secuencia de comandos similar a la de @Peludo del guión, pero utiliza la Característica de Capas y Seleccionar Por Ubicación:

import arcpy
arcpy.env.overwriteOutput = True

#adapt the following variabled to your data:
polygonLayer = r"C:\tmp\Test.gdb\Polygons"
pointLayer = r"C:\tmp\Test.gdb\Points"
copyField = "FieldNameToCopy"


#add new field to target feature class if it don't exists (you can delete it if you plan to create field manually)
fieldList = arcpy.ListFields(pointLayer)
fieldNameList = []
for field in fieldList:
    fieldNameList.append(field.name)
fieldType = arcpy.ListFields(polygonLayer,copyField)[0].type
if not copyField in fieldNameList:
    arcpy.AddField_management(pointLayer, copyField, fieldType)

arcpy.MakeFeatureLayer_management(polygonLayer, "PolygonLayer")

pntCursor = arcpy.UpdateCursor(pointLayer)
for pnt in pntCursor:
    rowID = pnt.OBJECTID
    arcpy.MakeFeatureLayer_management(pointLayer, "PointLayer", '"OBJECTID" = ' + str(rowID))

    #polygon selection based on CONTAINS selection method
    arcpy.SelectLayerByLocation_management("PolygonLayer", "CONTAINS", "PointLayer")

    #copy field values from polygon to point layer    
    polyCursor = arcpy.SearchCursor("PolygonLayer")        
    for poly in polyCursor:
        pnt.setValue(copyField, poly.getValue(copyField))
        pntCursor.updateRow(pnt)

    arcpy.Delete_management("PointLayer")        

del pntCursor, polyCursor, pnt, poly

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