Quiero organizar 96 puntos como un círculo/anillo. Es allí una manera de hacer esto de forma automática, por ejemplo "Buffer", "vértices"?
Respuestas
¿Demasiados anuncios?
Dalroth
Puntos
2468
En QGIS, se podría definir una pequeña función de Python que hace esto:
import numpy as np
def circlepoints(nPoints=20, radius=1, center=[0,0]):
resultlayer = QgsVectorLayer("Point", "result", "memory")
points = []
for angle in np.linspace(0,2*np.pi, nPoints, endpoint=False):
point = QgsFeature()
point.setGeometry(QgsGeometry.fromPoint( QgsPoint(center[0]+np.sin(angle)*radius, center[1]+np.cos(angle)*radius) ))
points.append(point)
resultlayer.dataProvider().addFeatures(points)
QgsMapLayerRegistry.instance().addMapLayer(resultlayer)
A continuación, puede crear los puntos llamando
circlepoints(96, 2, [5,3])
por ejemplo:
Esto debería funcionar para ArcGIS con arcpy y debe ser lo suficientemente simple que se puede adaptar a lo que necesitas:
import arcpy
import math
# Two dimensional rotation
# returns coordinates in a tuple (x,y)
def rotate(x, y, r):
rx = (x*math.cos(r)) - (y*math.sin(r))
ry = (y*math.cos(r)) + (x*math.sin(r))
return (rx, ry)
# create a ring of points centered on center (x,y) with a given radius
# using the specified number of points
# center should be a tuple or list of coordinates (x,y)
# returns a list of point coordinates in tuples
# ie. [(x1,y1),(x2,y2
def point_ring(center, num_points, radius):
arc = (2 * math.pi) / num_points # what is the angle between two of the points
points = []
for p in range(num_points):
(px,py) = rotate(0, radius, arc * p)
px += center[0]
py += center[1]
points.append((px,py))
return points
# for demo purposes, just create a simple shape file
arcpy.CreateFeatureclass_management("C:\\temp","point_ring.shp","POINT")
incur = arcpy.InsertCursor("c:\\temp\\point_ring.shp")
# loop through the points created from a ring centered at (150,150),
# with a radius of 10, using 96 points
# and insert them into our shape file as features
for point in point_ring((150,150),96, 10):
in_row = incur.newRow()
in_row.Shape = arcpy.Point(point[0], point[1])
incur.insertRow(in_row)
del incur
Resultado: