Cambiar el tamaño del polígono a lo largo de un eje

8

Usando el siguiente ejemplo, puedo cambiar el tamaño por escala y origen.

    polygonFeature.geometry.resize(scale, origin);
    vectorLayer.redraw();

¿Pero alguien tiene alguna sugerencia o código de muestra sobre cómo cambiaría el tamaño de un polígono en uno de sus ejes?

Por ejemplo: me gustaría cambiar el tamaño del polígono naranja a algo como el polígono rojo. Entonces, solo los bordes norte y sur se mueven, mientras que los bordes este oeste se mantienen constantes.

ingrese la descripción de la imagen aquí

EDITAR # 1 Aquí hay un caso de uso y datos de ejemplo: un usuario solo quiere una parte del rectángulo naranja porque solo está interesado en la costa y los proveedores de satélites le cobrarán más por toda la imagen. El usuario debe especificar qué parte de la imagen desea ordenar.

Aunque, no necesito toda la solución con controladores de tamaño, todo lo que necesito es la capacidad de cambiar el tamaño de la Altura del polígono .

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

EDITAR # 2: Tal vez estoy haciendo esto mal. Necesito una solución javascript (navegador) de openlayers y no puedo volver al servidor para cambiar el tamaño. Quizás lo que debería estar haciendo es interpolar puntos a lo largo de los bordes este y oeste de la geometría del polígono (puntos negros). Luego cree dos líneas (líneas verdes) en las que el usuario pueda arrastrar pero restringiendo el movimiento (arrastre) a esos puntos interpolados. Cuando el usuario está "hecho", obtengo el polígono amarillo restante

ingrese la descripción de la imagen aquí

CaptDragon
fuente
2
¿El polígono es siempre un rectángulo? ¿Están los bordes alineados arbitrariamente o siguen alguna orientación de cuadrícula de mapa de un sistema de referencia de coordenadas?
Mike T
Buena pregunta, bueno, en realidad siempre será un rectángulo, entonces sí. Son geodésicos y es por eso que los bordes superior e inferior no son (o no parecen ser) iguales. Son franjas de satélite, por lo que dan la vuelta al mundo, pero en EPSG: 4326 suben y bajan en líneas onduladas.
CaptDragon
@ Mike: vea Editar # 1 para más detalles.
CaptDragon
Lo que buscas es una transformación afín , excepto que no conozco bien a los jugadores abiertos para ver si es compatible con esto ... Estoy seguro de que alguien puede intervenir en este plomo para dar una respuesta
Mike T
Hice la transformación afín ... observe cómo la imagen se alinea correctamente en el mapa de lado ... realmente solo necesito cambiar el tamaño de la altura del polígono.
CaptDragon

Respuestas:

1

En el caso general, usaría una transformación en perspectiva para transformar su cuadrilátero original en un cuadrado unitario y viceversa.

Los pasos básicos son:

  1. Encuentra la matriz de transformación afín de tu quad al cuadrado de la unidad.
  2. Escale el cuadrado de la unidad en la misma proporción que el usuario quiere escalar el quad original.
  3. Invierta la matriz obtenida en el paso 1.
  4. Aplique esa matriz inversa al cuadrado aplastado para transformarlo nuevamente en el espacio del mapa.

Advertencias:

  • Compruebe que tiene una matriz válida y que es invertible.
  • Solo funcionará con éxito con cuadriláteros convexos.

Para el trabajo que estás haciendo, no deberías tener casos extraños como polígonos cóncavos. No estoy seguro de qué pasaría con los quads que cubren las regiones polares, sospecho que primero tendrías que proyectarlo en alguna proyección polar.

El enlace publicado en el paso 1. conduce a un documento con muchos cálculos matemáticos y algunos códigos con muchos elementos en C ++. Pero no debería ser demasiado difícil descubrir cómo funciona el código porque es solo una pequeña función en la parte superior del archivo .

MerseyViking
fuente
Gracias ... pero realmente necesito una solución JavaScript de Openlayers.
CaptDragon
1
La matemática es mucho más simple y más general que eso. Deje que el quad tenga vértices (x0, x1, x2, x3) (en orden), donde desea fijar el lado x0x1. Reescalarlo por un factor a a lo largo de los lados x1x2 y x0x3 crea el nuevo polígono (x0, x1, x2 ', x3') donde x2 '= x1 + (x2-x1) * a y x3' = x0 + (x3-x0) * a. Es mejor trabajar en coordenadas proyectadas.
whuber