Saya tertarik memeriksa lebar rata-rata poligon yang mewakili permukaan jalan. Saya juga memiliki garis tengah jalan sebagai vektor (yang kadang-kadang tidak persis di tengah). Dalam contoh ini, garis tengah jalan berwarna merah, dan poligon berwarna biru:
Salah satu pendekatan brute force yang saya pikirkan, adalah untuk menyangga garis dengan sedikit demi sedikit, memotong penyangga dengan jaring jaring, memotong jalan-poligon dengan jaring jaring, menghitung daerah berpotongan untuk kedua langkah persimpangan dan terus melakukan ini sampai kesalahannya kecil. Ini adalah pendekatan yang kasar, dan saya bertanya-tanya apakah ada solusi yang lebih elegan. Selain itu, ini akan menutupi lebar jalan besar dan jalan kecil.
Saya tertarik dengan solusi yang menggunakan perangkat lunak ArcGIS 10, PostGIS 2.0 atau QGIS. Saya telah melihat pertanyaan ini dan mengunduh alat Dan Patterson untuk ArcGIS10, tetapi saya tidak dapat menghitung apa yang saya inginkan dengannya.
Saya baru saja menemukan alat Geometri Batas Minimum di ArcGIS 10 yang memungkinkan saya menghasilkan poligon hijau berikut:
Ini sepertinya solusi yang baik untuk jalan yang mengikuti kisi-kisi, tetapi tidak akan bekerja sebaliknya, jadi saya masih tertarik dengan saran lain.
Jawaban:
Bagian dari masalahnya adalah menemukan definisi yang sesuai dari "lebar rata-rata." Beberapa alami tetapi akan berbeda, setidaknya sedikit. Untuk kesederhanaan, pertimbangkan definisi berdasarkan properti yang mudah dihitung (yang akan mengesampingkan definisi yang didasarkan pada transformasi sumbu medial atau urutan buffer, misalnya).
Sebagai contoh, perhatikan bahwa intuisi pola dasar poligon dengan "lebar" yang pasti adalah penyangga kecil (katakanlah jari-jari r dengan ujung-ujung kuadrat) di sekitar polyline yang panjang dan cukup lurus (katakanlah panjang L ). Kami menganggap 2r = w sebagai lebarnya. Demikian:
Perimeter P- nya kira-kira sama dengan 2L + 2w;
Luasnya A kira-kira sama dengan w L.
Lebar w dan panjang L kemudian dapat diperoleh kembali sebagai akar kuadrat x ^ 2 - (P / 2) x + A; khususnya, kita dapat memperkirakan
Ketika Anda yakin poligon itu benar-benar panjang dan kurus, sebagai perkiraan lebih lanjut Anda dapat mengambil 2L + 2w untuk sama dengan 2L, dari mana
Kesalahan relatif dalam pendekatan ini sebanding dengan w / L: semakin kurus poligonnya, semakin dekat w / L ke nol, dan semakin baik perkiraannya.
Tidak hanya pendekatan ini sangat sederhana (hanya membagi area dengan perimeter dan kalikan dengan 2), dengan rumus apa pun itu tidak masalah bagaimana poligon berorientasi atau di mana ia berada (karena gerakan Euclidean seperti itu tidak mengubah area maupun perimeter).
Anda dapat mempertimbangkan menggunakan salah satu dari rumus ini untuk memperkirakan lebar rata-rata untuk setiap poligon yang mewakili segmen jalan. Kesalahan yang Anda buat dalam perkiraan awal w (dengan rumus kuadrat) terjadi karena area A juga mencakup irisan kecil di setiap belokan polyline asli. Jika jumlah sudut tikungan adalah t radian (ini adalah kelengkungan mutlak total dari polyline), maka benar-benar
P = 2L + 2w + 2 Pi tw dan
A = L w + Pi tw ^ 2.
Hubungkan ini ke solusi sebelumnya (rumus kuadrat) dan sederhanakan. Ketika asap hilang, kontribusi dari istilah kelengkungan t telah menghilang! Apa yang awalnya tampak seperti perkiraan sangat akurat untuk buffer polyline yang tidak memotong sendiri (dengan ujung kuadrat). Untuk poligon lebar variabel, oleh karena itu ini merupakan definisi yang wajar dari lebar rata-rata.
sumber
Di sini saya menunjukkan sedikit optimasi tentang solusi @whuber, dan saya memasukkan istilah "lebar buffer", karena ini berguna untuk mengintegrasikan solusi dari masalah yang lebih umum: Apakah ada fungsi invers st_buffer, yang mengembalikan estimasi lebar?
Untuk masalah ini, pertanyaan @celenius tentang lebar jalan ,
sw
, solusinya adalahdi mana
sw
"lebar rata-rata",g1
garis tengahg2
, dan jalang2
adalah POLYGON . Saya hanya menggunakan pustaka standar OGC, diuji dengan PostGIS , dan menyelesaikan aplikasi praktis serius lainnya dengan fungsi buffer_width yang sama.DEMONSTRASI
A2
adalah luasg2
,L1
panjang garis tengah (g1
) darig2
.Misalkan kita dapat menghasilkan
g2
dengang2=ST_Buffer(g1,w)
, dan itug1
adalah lurus, jadig2
adalah persegi panjang dengan panjangL1
dan lebar2*w
, danIni bukan formula yang sama dengan @whuber, karena
w
ini adalah setengah darig2
lebar persegi panjang ( ). Ini adalah penduga yang baik, tetapi seperti yang dapat kita lihat dengan tes (di bawah), tidak tepat, dan fungsinya menggunakannya sebagai petunjuk, untuk mengurangig2
area, dan sebagai penduga akhir.Di sini kita tidak mengevaluasi buffer dengan "endcap = square" atau "endcap = round", yang membutuhkan penjumlahan
A2
dari area buffer titik dengan yang samaw
.DAFTAR PUSTAKA: dalam forum serupa tahun 2005 , W. Huber menjelaskan solusi sejenis dan lainnya.
UJI DAN ALASAN
Untuk garis lurus hasilnya, seperti yang diharapkan, tepat. Tetapi untuk geometri lainnya hasilnya bisa mengecewakan. Alasan utamanya adalah, mungkin, semua model adalah untuk persegi panjang yang tepat, atau untuk geometri yang dapat diperkirakan menjadi "strip persegi panjang". Di sini "test kit" untuk memeriksa batas perkiraan ini (lihat
wfactor
hasil di atas).HASIL:
DENGAN RECTANGLES (jalur sentral adalah LURUS LURUS):
DENGAN GEOMETRI LAINNYA (garis tengah dilipat):
Tentang
btype
lihat panduan ST_Buffer , dengan ilustratin yang baik dan LINESTRING yang digunakan di sini.KESIMPULAN :
w_estim
selalu lebih baik daripadaw_near
;g2
geometri "dekat ke persegi panjang" , ok, apa sajawfactor
wfactor=~0.01
untuk kesalahan 1%w_estim
. Sampai di wfactor ini, gunakan estimator lain.Perhatian dan pencegahan
Mengapa kesalahan estimasi terjadi? Ketika Anda menggunakan
ST_Buffer(g,w)
, Anda harapkan, dengan "model strip persegi panjang", bahwa area baru yang ditambahkan oleh buffer lebarw
sekitarw*ST_Length(g)
atauw*ST_Perimeter(g)
... Ketika tidak, biasanya dengan overlay (lihat garis terlipat) atau dengan "gaya", adalah ketika estimasiw
kesalahan rata-rata . Ini adalah pesan utama dari tes ini.Untuk mendeteksi masalah ini di sembarang raja buffer , periksa perilaku generasi buffer:
HASIL:
sumber
Jika Anda dapat menggabungkan data poligon ke data garis tengah Anda (baik dengan cara spasial atau tabular), maka jumlahkan area poligon untuk setiap penyelarasan garis tengah dan bagi dengan panjang garis tengah.
sumber
Saya telah mengembangkan formula untuk lebar rata-rata poligon dan memasukkannya ke dalam fungsi Python / ArcPy. Rumus saya berasal dari (tetapi secara substansial meluas) gagasan paling mudah tentang rata-rata lebar yang saya lihat dibahas di tempat lain; yaitu, diameter lingkaran yang memiliki area yang sama dengan poligon Anda. Namun, dalam pertanyaan di atas dan di proyek saya, saya lebih tertarik pada lebar sumbu tersempit. Selain itu, saya tertarik pada lebar rata-rata untuk bentuk yang berpotensi rumit dan tidak cembung.
Solusi saya adalah:
Itu adalah:
Fungsinya adalah:
Berikut adalah peta yang diekspor dengan lebar rata-rata (dan beberapa atribut geometri lain untuk referensi) di berbagai bentuk menggunakan fungsi dari atas:
sumber
area / perimeter * 4
.Solusi lain dengan perkiraan medial axis:
Hasil pasti akan salah untuk poligon-poligon di mana sumbu medial perkiraan bukan garis kontinu tunggal, sehingga Anda dapat memeriksanya sebelum langkah 1 dan kembali
NULL
atau sesuatu.Berikut ini adalah contoh dari fungsi PostgreSQL (catatan: Anda perlu menginstal PostGIS dan postgis_sfcgal ekstensi):
Kerugian:
Solusi ini tidak akan bekerja dengan kasus ketika poligon hampir empat persegi panjang dan manusia secara intuite dapat menentukan panjangnya tetapi perkiraan medial axis memiliki cabang kecil di dekat tepi dan dengan demikian algoritma mengembalikan Tidak ada.
Contoh:
sumber