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:
Publicar un comentario