jueves, 16 de noviembre de 2017

Generando elipse con sus ecuaciones paramétricas y PyQGIS

En un post anterior se generaron buffers empleando las ecuaciones parámetricas de la circunferencia. Las de la elipse son muy similares y basta una pequeña modificación en el código, tal como se muestra a continuación, para producir estas curvas cerradas y sus respectivos polígonos.

El código siguiente produce una elipse de 60 puntos centrada en (392127.908689, 4449521.71257) con un semieje mayor de 200 m paralelo al eje de las x y un semieje menor de 100 m paralelo al eje de las y.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from math import pi, cos, sin

pt = (392127.908689, 4449521.71257)

a = 200
b = 100

x0 = pt[0]
y0 = pt[1]

interv = 2*pi

parts = 60

add = interv/parts

t = 0

t_values = [ 0 ]

for i in range(parts-1):
    t += add
    t_values.append(t)

points = [ QgsPoint( x0 + a*cos(t), y0 + b*sin(t)) for t in t_values ]

epsg = 32612

uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'point',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(len(points)) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPoint(points[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

points.append(points[0])

uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'line',
                           'memory')

prov = mem_layer.dataProvider()

line = [ points ]

feats = [ QgsFeature() for i in range(len(line)) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPolyline(line[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'polygon',
                           'memory')

prov = mem_layer.dataProvider()

polygon = [ [ points ] ]

feats = [ QgsFeature() for i in range(len(polygon)) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPolygon(polygon[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Después de ejecutado el código anterior se obtiene la visualización siguiente para las memory layers de puntos y línea:


y esta otra para la memory layer tipo polígono:


No hay comentarios: