Ubah ukuran poligon di sepanjang satu sumbu

8

Menggunakan contoh berikut ini saya dapat mengubah ukuran berdasarkan skala dan asal.

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

Tetapi apakah ada yang punya saran atau kode sampel tentang bagaimana saya akan mengubah ukuran poligon pada salah satu kapaknya?

Sebagai contoh: Saya ingin mengubah ukuran poligon oranye menjadi sesuatu seperti poligon merah. Jadi hanya tepi utara dan selatan yang bergerak sementara tepi barat timur tetap konstan.

masukkan deskripsi gambar di sini

EDIT # 1 Berikut ini adalah kasus penggunaan dan contoh data: Seorang pengguna hanya ingin sebagian dari persegi panjang oranye karena dia hanya tertarik pada garis pantai dan vendor satelit akan membebani lebih banyak untuk seluruh gambar. Pengguna perlu menentukan bagian gambar apa yang ingin mereka pesan.

Meskipun, saya tidak perlu seluruh solusi dengan ukuran menangani semua yang saya butuhkan adalah kemampuan untuk mengubah ukuran Ketinggian poligon .

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

EDIT # 2: Mungkin saya salah tentang ini. Saya membutuhkan solusi javascript (browser) openlayers dan tidak dapat kembali ke server untuk mengubah ukuran. Mungkin yang harus saya lakukan adalah interpolasi titik di sepanjang tepi timur dan barat dari geometri poligon (titik hitam). Kemudian buat dua garis (garis hijau) di mana pengguna dapat menyeret tetapi membatasi gerakan (draging) ke titik-titik yang diinterpolasi. Ketika pengguna "selesai" saya mendapatkan poligon kuning yang tersisa?

masukkan deskripsi gambar di sini

CaptDragon
sumber
2
Apakah poligon selalu persegi panjang? Apakah tepiannya sejajar sewenang-wenang, atau apakah mereka mengikuti beberapa orientasi kisi-kisi peta dari sistem referensi koordinat?
Mike T
Pertanyaan bagus, yah pada kenyataannya itu akan selalu menjadi persegi panjang, jadi YA. Mereka geodesik dan itulah mengapa tepi atas dan bawah tidak (atau tidak terlihat) sama. Mereka adalah petak satelit, jadi mereka mengelilingi dunia, tetapi dalam EPSG: 4326 mereka naik dan turun dalam garis bergelombang.
CaptDragon
@ Mike: lihat Edit # 1 untuk lebih jelasnya.
CaptDragon
Yang Anda kejar adalah trasformasi afin , kecuali bahwa saya tidak tahu openlayers yang baik untuk melihat apakah mendukung ini .. Saya yakin seseorang dapat berpacu pada petunjuk ini untuk memberikan jawaban
Mike T
Saya melakukan transformasi affine ... perhatikan bagaimana gambar terpasang dengan benar pada peta menyamping ... saya benar-benar hanya perlu mengubah ukuran ketinggian poligon.
CaptDragon

Jawaban:

1

Dalam kasus umum, saya akan menggunakan transformasi perspektif untuk mengubah segiempat asli Anda menjadi satuan persegi dan kembali lagi.

Langkah-langkah dasarnya adalah:

  1. Temukan matriks transformasi affine dari quad ke unit square.
  2. Skala unit kuadrat dengan proporsi yang sama pengguna ingin skala quad asli.
  3. Balikkan matriks yang diperoleh pada langkah 1.
  4. Menerapkan matriks invers ke kuadrat squash untuk mengubahnya kembali menjadi ruang peta.

Peringatan:

  • Pastikan Anda memiliki matriks yang valid dan tidak dapat dibalik.
  • Ini hanya akan berhasil dengan quadrilaterals cembung.

Untuk pekerjaan yang Anda lakukan Anda seharusnya tidak memiliki kasus aneh seperti poligon cekung. Saya tidak yakin apa yang akan terjadi dengan paha depan yang menutupi wilayah kutub, saya kira Anda harus memproyeksikannya ke dalam beberapa proyeksi kutub terlebih dahulu.

Tautan yang diposting pada langkah 1. mengarah ke kertas matematika-berat dan beberapa kode C ++ template-heavy. Tetapi seharusnya tidak terlalu sulit untuk mengetahui bagaimana kode bekerja karena itu hanya fungsi kecil di bagian atas file .

MerseyViking
sumber
Terima kasih ... tetapi saya benar-benar membutuhkan solusi javascript openlayers.
CaptDragon
1
Matematika jauh lebih sederhana dan lebih umum dari itu. Biarkan quad memiliki simpul (x0, x1, x2, x3) (dalam urutan), di mana Anda ingin memperbaiki sisi x0x1. Mengubah skala dengan faktor a sepanjang sisi x1x2 dan x0x3 menciptakan poligon baru (x0, x1, x2 ', x3') di mana x2 '= x1 + (x2-x1) * a dan x3' = x0 + (x3-x0) * Sebuah. Cara terbaik adalah bekerja dalam koordinat yang diproyeksikan.
whuber