[OpenLayers-Users] ModifyFeature: Rotate Center Point and
Control Point
Eric Lemoine
eric.c2c at gmail.com
Fri Nov 7 13:22:59 EST 2008
Hi. Thanks for sharing your code.
Adding a getCentroid function to the Geometry class would make sense
to me. Does your getCenter func effectively calculate the centroid?
Also, the centroid should be cached in a property of the geom to avoid
calculating it multiple times (the cache should obviously be cleared
when the coords are changed). That'be great if you could open a ticket
for that, with your patch.
And yes, I think it'd be good that the modify feature control could be
configured so that the rotate and drag handles are rendered at the
centroid of the feature. But I think this should be optional, for the
cases when it costs too much to calculate the centroid.
This patch would go in a ticket of its own.
Thanks,
Eric
2008/11/6, carls <carlshe at 163.com>:
>
> I just try to do some modification to ModifyFeature.js and Geometry.js.
>
> one function 'GetCenter()' is added to OpenLayers.Geometry, and a little
> modification is applied to 'collectDragHandle' and 'collectRadiusHandle' of
> ModifyFeature.js.
>
> for Geometry.js:
>
>
> GetCenter: function() {
> var vertices = new Array();
> var center = new OpenLayers.Geometry.Point(0, 0);
> var xx = 0, yy = 0;
> /**
> * Method: Collect All Vertices
> */
> function collectAllVertices(geometry, vertices) {
> var i, vertex, component, len;
> if (geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
> vertex = new OpenLayers.Feature.Vector(this);
> vertices.push(vertex);
> } else {
> var numVert = geometry.components.length;
> if (geometry.CLASS_NAME == "OpenLayers.Geometry.LinearRing")
> {
> numVert -= 1;
> }
> for (i = 0; i < numVert; ++i) {
> component = geometry.components[i];
> if (component.CLASS_NAME == "OpenLayers.Geometry.Point")
> {
> vertex = new OpenLayers.Feature.Vector(component);
> vertices.push(vertex);
> } else {
> collectAllVertices(component, vertices);
> }
> }
> }
> }
>
> collectAllVertices(this,vertices);
> if (vertices.length > 0) {
> for (ii in vertices) {
> xx += vertices[ii].geometry.x;
> yy += vertices[ii].geometry.y;
> }
> center = new OpenLayers.Geometry.Point(xx / vertices.length, yy
> / vertices.length);
> }
> return center;
> },
>
>
> for ModifyFeature.js:
>
> /**
> * Method: collectDragHandle
> * Collect the drag handle for the selected geometry.
> */
> collectDragHandle: function() {
> var geometry = this.feature.geometry;
> ///var center = geometry.getBounds().getCenterLonLat();
> //var originGeometry = new OpenLayers.Geometry.Point(
> // center.lon, center.lat
> //);
> var originGeometry = geometry.GetCenter();
> var origin = new OpenLayers.Feature.Vector(originGeometry);
> originGeometry.move = function(x, y) {
> OpenLayers.Geometry.Point.prototype.move.call(this, x, y);
> geometry.move(x, y);
> };
> this.dragHandle = origin;
> this.layer.addFeatures([this.dragHandle], { silent: true });
> },
> /**
> * Method: collectRadiusHandle
> * Collect the radius handle for the selected geometry.
> */
> collectRadiusHandle: function() {
> var geometry = this.feature.geometry;
> var bounds = geometry.getBounds();
> //var center = bounds.getCenterLonLat();
> //var originGeometry = new OpenLayers.Geometry.Point(
> // center.lon, center.lat
> //);
> var originGeometry = geometry.GetCenter();
> var radiusGeometry = new OpenLayers.Geometry.Point(
> (bounds.right - originGeometry.x) * 1.3 + originGeometry.x,
> (bounds.bottom - originGeometry.y) * 1.3 + originGeometry.y
> );
>
> var radius = new OpenLayers.Feature.Vector(radiusGeometry);
> var resize = (this.mode & OpenLayers.Control.ModifyFeature.RESIZE);
> var rotate = (this.mode & OpenLayers.Control.ModifyFeature.ROTATE);
> radiusGeometry.move = function(x, y) {
> OpenLayers.Geometry.Point.prototype.move.call(this, x, y);
> var dx1 = this.x - originGeometry.x;
> var dy1 = this.y - originGeometry.y;
> var dx0 = dx1 - x;
> var dy0 = dy1 - y;
> if (rotate) {
> var a0 = Math.atan2(dy0, dx0);
> var a1 = Math.atan2(dy1, dx1);
> var angle = a1 - a0;
> angle *= 180 / Math.PI;
> geometry.rotate(angle, originGeometry);
> }
> if (resize) {
> var l0 = Math.sqrt((dx0 * dx0) + (dy0 * dy0));
> var l1 = Math.sqrt((dx1 * dx1) + (dy1 * dy1));
> geometry.resize(l1 / l0, originGeometry);
> }
> };
> this.radiusHandle = radius;
> this.layer.addFeatures([this.radiusHandle], { silent: true });
> },
>
>
>
> I tested it and it seems can run well.
>
>
>
>
> carls wrote:
>>
>> while using ModifyFeature control on a regular polygon, it can be found
>> the rotate center is not right the real center of a regular polygon? (try
>> it with a regular triangle)
>>
>> additionally, while rotating and modifying a rectangle parallel to the
>> axis, the control point for rotating might be at the same position of the
>> right-bottom corner of the rectangle, which confuses the action of
>> rotation and modifition, i.e. what i really need is to rotate the
>> rectangle, but really I moved the right-bottom corner of it. This can be
>> resolved if the control point becomes a little more far to the center
>> point than any vertex of the geometry.
>>
>> It is not a big problem. But it will be better if imporved.
>>
>> Thanks!
>>
>
>
> -----
> Regards, Carl SHE
> --
> View this message in context:
> http://n2.nabble.com/ModifyFeature%3A-Rotate-Center-Point-and-Control-Point-tp1394002p1464935.html
> Sent from the OpenLayers Users mailing list archive at Nabble.com.
>
> _______________________________________________
> Users mailing list
> Users at openlayers.org
> http://openlayers.org/mailman/listinfo/users
>
More information about the Users
mailing list