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?
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?
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!
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
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.
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 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.