Saya mencoba mengekstrapolasi dari segmen garis untuk menemukan titik pada baris tetapi ke-3 dari jalan 'kembali', yaitu mencoba menemukan titik new
, memberikan poin A
dan di B
bawah:
Diberi garis, saya dapat menginterpolasi untuk mendapatkan posisi pada persentase tertentu di dalamnya:
=# select st_line_interpolate_point(
st_makeline('0101000020E6100000300DC347C49418C03EE8D9ACFAA44A40',
'0101000020E6100000FB743C66A03218C0CDCCCCCCCC7C4A40'),
0.333);
0101000020E6100000ED45B41D537718C069C6A2E9EC984A40
Saya mencoba memasukkan angka negatif untuk menemukan titik di sepanjang garis dalam arah yang berlawanan, tetapi itu gagal karena argumen interpolasi harus dalam kisaran [0, 1]
Saya berpikir tentang pertama-tama menskalakan garis, tetapi itu tidak menggunakan pusat garis sebagai asal, jadi tidak ada gunanya untuk tujuan saya.
sumber
Telah menyelesaikannya dengan:
Penjelasan:
(2-d) Skala titik awal dengan faktor 1,3333, dengan mengambil titik tengah segmen garis sebagai asal untuk penskalaan.
Keluar kertas grafik!
http://en.wikipedia.org/wiki/Affine_transformation
sumber
Saya menulis fungsi untuk ini:
Pemakaian:
Perhatikan bahwa ini menghasilkan linestring yang lebih panjang tetapi bukan titik akhir.
Kode pada GitHub Gist (jika Anda upvote di sini saya akan menghargai bintang di sana juga)
Deskripsi parameter (jika Anda melewatkannya di komentar fungsi sql):
sumber
original_length * head_rate + head_constant
. Jika Anda ingin menjadi dua kali lipat maka laju head adalah 2, konstanta adalah 0. Kami di hungary biasanya menggunakan proyeksi EOV yang berbasis meter. Jadi jika saya ingin menambahkan 2 meter ke akhir baris, saya mengatur ekor: menilai ke 1 dan tail_constant ke 2.