Ändern Sie die Größe des Polygons entlang einer Achse

8

Anhand des folgenden Beispiels kann ich die Größe nach Maßstab und Herkunft ändern.

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

Aber hat jemand Vorschläge oder Beispielcode, wie ich die Größe eines Polygons auf einer seiner Achsen ändern würde?

Zum Beispiel: Ich möchte die Größe des orangefarbenen Polygons auf etwas wie das rote Polygon ändern. Es bewegen sich also nur die Nord- und Südränder, während die Ost-West-Ränder konstant bleiben.

Geben Sie hier die Bildbeschreibung ein

BEARBEITEN 1 Hier ein Anwendungsfall und Beispieldaten: Ein Benutzer möchte nur einen Teil des orangefarbenen Rechtecks, da er nur an der Küste interessiert ist und Satellitenanbieter ihm mehr für das gesamte Bild in Rechnung stellen. Der Benutzer muss angeben, welchen Teil des Bildes er bestellen möchte.

Obwohl ich nicht die gesamte Lösung mit Größengriffen benötige, brauche ich nur die Möglichkeit, die Höhe des Polygons zu ändern .

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

EDIT # 2: Vielleicht mache ich das falsch. Ich benötige eine Openlayers-Javascript-Lösung (Browser) und kann zum Ändern der Größe nicht zum Server zurückkehren. Vielleicht sollte ich Punkte entlang der Ost- und Westkante der Polygongeometrie interpolieren (schwarze Punkte). Erstellen Sie dann zwei Linien (grüne Linien), in denen der Benutzer ziehen kann, aber die Bewegung (Draging) auf diese interpolierten Punkte beschränkt. Wenn der Benutzer "fertig" ist, bekomme ich das verbleibende gelbe Polygon?

Geben Sie hier die Bildbeschreibung ein

CaptDragon
quelle
2
Ist das Polygon immer ein Rechteck? Sind die Kanten willkürlich ausgerichtet oder folgen sie einer Kartenrasterausrichtung eines Koordinatenreferenzsystems?
Mike T
Gute Frage, in Wirklichkeit wird es immer ein Rechteck sein, also JA. Sie sind geodätisch und deshalb sind die oberen und unteren Kanten nicht gleich (oder sehen nicht so aus). Sie sind Satellitenschwaden, also gehen sie um den Globus, aber in EPSG: 4326 gehen sie in Wellenlinien auf und ab.
CaptDragon
@Mike: Weitere Informationen finden Sie unter Bearbeiten Nr. 1.
CaptDragon
Was Sie suchen, ist eine affine Transformation , außer dass ich Openlayers nicht so gut kenne, um zu sehen, ob sie dies unterstützen. Ich bin sicher, dass sich jemand auf diesen Hinweis einlassen kann, um eine Antwort zu geben
Mike T
Ich habe die affine Transformation durchgeführt ... beachte, wie das Bild auf der Karte seitlich richtig ausgerichtet ist ... ich muss wirklich nur die Größe des Polygons ändern.
CaptDragon

Antworten:

1

Im allgemeinen Fall würde ich eine perspektivische Transformation verwenden, um Ihr ursprüngliches Viereck in ein Einheitsquadrat und wieder zurück zu transformieren.

Die grundlegenden Schritte sind:

  1. Finden Sie die affine Transformationsmatrix von Ihrem Quad zum Einheitsquadrat.
  2. Skalieren Sie das Einheitsquadrat um den gleichen Anteil, den der Benutzer für das ursprüngliche Quad skalieren möchte.
  3. Invertieren Sie die in Schritt 1 erhaltene Matrix.
  4. Wenden Sie diese inverse Matrix auf das gequetschte Quadrat an, um es wieder in den Kartenraum umzuwandeln.

Vorsichtsmaßnahmen:

  • Überprüfen Sie, ob Sie eine gültige Matrix haben und diese invertierbar ist.
  • Es funktioniert nur erfolgreich mit konvexen Vierecken.

Für die Arbeit, die Sie tun, sollten Sie keine seltsamen Fälle wie konkave Polygone haben. Ich bin mir nicht sicher, was mit Quads passieren würde, die die Polarregionen abdecken. Ich vermute, Sie müssten es zuerst in eine Polarprojektion projizieren.

Der in Schritt 1 veröffentlichte Link führt zu einem mathematikintensiven Papier und etwas C ++ - vorlagenintensivem Code. Es sollte jedoch nicht zu schwierig sein, herauszufinden, wie der Code funktioniert, da es sich nur um eine kleine Funktion am Anfang der Datei handelt .

MerseyViking
quelle
Danke ... aber ich brauche wirklich eine Openlayers-Javascript-Lösung.
CaptDragon
1
Die Mathematik ist viel einfacher und allgemeiner. Lassen Sie das Quad Eckpunkte (x0, x1, x2, x3) (in der Reihenfolge) haben, an denen Sie die x0x1-Seite fixieren möchten. Durch Neuskalieren um einen Faktor a entlang der x1x2- und x0x3-Seiten wird das neue Polygon (x0, x1, x2 ', x3') erstellt, wobei x2 '= x1 + (x2-x1) * a und x3' = x0 + (x3-x0) * ein. Es ist am besten, in projizierten Koordinaten zu arbeiten.
whuber