4 votos

La creación de un círculo con puntos

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"?

8voto

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:

7voto

David Holm Puntos 6165

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: enter image description here

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