Lagi

Bangun kurva dengan jarak yang sama dari dua garis lurus

Bangun kurva dengan jarak yang sama dari dua garis lurus


Diberikan dua garis lurus yang ditentukan oleh masing-masing dua titik, saya ingin mendapatkan garis yang memisahkan titik-titik yang lebih dekat ke garis a dari titik-titik yang lebih dekat ke garis b. Kode PostGIS terlampir adalah contoh kasus, ia menemukan titik dengan jarak yang sama dengan membuat banyak buffer di sekitar garis dan memotongnya:

Apakah ada algoritma untuk menghitung garis ini secara lebih langsung, tanpa titik pengambilan sampel atau raster?

Saya pikir garis untuk contoh ini akan memiliki bagian tengah linier, tetapi titik-titik ditempatkan sedikit di bawah garis itu. Apakah mereka ditempatkan dengan benar?

CREATE TABLE tv_lines1 ( teks id PRIMARY KEY, geometri geom(linestring, 4326)); -- atur CRS yang tidak berarti untuk penanganan yang mudah di QGIS INSERT INTO tv_lines1 (id, geom) SELECT 'a', ST_SetSRID(ST_MakeLine(ST_Point(0.0, 0.0), ST_Point(30.0, 0.0)), 4326); INSERT INTO tv_lines1 (id, geom) SELECT 'b', ST_SetSRID(ST_MakeLine(ST_Point(16.0, 2.0), ST_Point(40.0, 12.0)), 4326); BUAT INDEKS PADA tv_lines1 MENGGUNAKAN Gist (geom); -- buat buffer dalam Langkah 0.1 CREATE TABLE tv_buffers ( teks line_id, float ukuran, geometri geom(linestring, 4326), PRIMARY KEY (line_id, ukuran)); INSERT INTO tv_buffers (line_id, size) SELECT id, generate_series(1, 1000) / 10.0 FROM tv_lines1; UPDATE tv_buffers bf SET geom = ST_ExteriorRing(ST_Buffer(l1.geom, size)) FROM tv_lines1 l1 WHERE l1.id = bf.line_id; BUAT INDEKS PADA tv_buffers MENGGUNAKAN Gist(geom); -- temukan persimpangan CREATE TABLE tv_intersections ( id SERIAL PRIMARY KEY, float jarak, geometri geom(titik, 4326)); INSERT INTO tv_intersections (jarak, geom) SELECT bf1.size, (ST_DUMP(ST_Intersection(bf1.geom, bf2.geom))).geom FROM tv_buffers bf1, tv_buffers bf2 WHERE bf1.line_id = 'a' AND bf2.line_id = 'a' DAN bf2.line_id = 'a' DAN bf2.line_id = ' b' DAN bf1.size = bf2.size; BUAT INDEKS PADA tv_intersections MENGGUNAKAN Gist(geom);

Bagaimana dengan mempartisi ruang Anda menjadi 9 wilayah dan menerapkan kriteria jarak yang sama secara terpisah di masing-masing wilayah. Sebagai contoh,

Untuk ruas garis #1, bagilah ruang menjadi 3 wilayah

  1. Titik-titik yang proyeksinya sepanjang ruas garis normal sebenarnya jatuh pada ruas garis tersebut. Sebut sajaC1.
  2. Titik-titik yang proyeksinya sepanjang segmen garis normal jatuh ke kiri segmen garis (yaitu, mereka mendarat di garis imajiner yang memanjang dari segmen tetapi tidak pada segmen itu sendiri). Sebut sajaL1.
  3. Sama seperti Wilayah 2 tetapi titik-titiknya mendarat di sebelah kanan. Sebut sajaR1.

Ulangi di atas untuk segmen garis #2. Sebut wilayahnyaC2,L2, danR2.

Perpotongan semua kombinasi daerah ini memberi Anda 9 daerah berbeda di mana persamaan jarak dari suatu titik di daerah itu ke kedua segmen garis dapat dihitung secara analitis. Misalnya untuk daerahC1danC2persamaan dihitung secara analitis ke segmennya masing-masing. Untuk wilayahL1,R1,L2, danR2jarak adalah jarak ke titik akhir terdekat dengan segmennya masing-masing.

Anda dapat menghitung jarak ini secara analitis dan menggabungkan jawaban dari semua 9 wilayah.


Anda dapat mengambil rata-rata dari setiap pasangan titik akhir dan menarik garis di antara mereka. Katakanlah dua titik kiri memiliki ID 1 dan 2,

DENGAN t AS ( SELECT avg(ST_X(geom)) as x, avg(ST_Y(geom)) as y FROM test WHERE gid in (1, 2) ) INSERT INTO test (geom) SELECT ST_SetSRID(ST_MakePoint(tx, ty) , 4326) DARI t;

Itu menciptakan titik baru di tengah-tengah mereka. Lakukan hal yang sama untuk pasangan tangan kanan, lalu tarik garis di antara keduanya. Jika lokasi titik akhir penting, Anda mungkin dapat memangkas garis setelah Anda membuatnya.


Tonton videonya: Jarak Antara Dua Garis Sejajar