Saya mencoba membuat algoritma untuk membuat lingkaran jari-jari maksimum dalam poligon tidak beraturan (saluran sensus) berdasarkan pusat lingkaran yang diberikan.
Motivasi untuk ini adalah untuk mengaburkan lokasi seseorang yang telah menjawab survei. Lokasi aktual mereka diketahui, namun perlu dikaburkan dalam analisis, untuk merilis data kepada publik, untuk analisis lebih lanjut.
Kami ingin memiliki poligon berbentuk donat untuk setiap responden survei yang memiliki beberapa jari-jari dalam (mudah), dibatasi oleh jari-jari luar yang dibatasi oleh saluran sensus tempat individu tersebut berada. Lokasi akhir mereka akan ditempatkan secara acak di dalam poligon donat. .
Saya telah melihat banyak jawaban untuk pertanyaan serupa di sini, tetapi bukan yang spesifik ini, yang dalam hal ini dimulai dengan lokasi SPESIFIK.
Setelah donat didirikan, kami dapat mengacak lokasi respons individu dalam poligon. Itu relatif mudah ...
Terima kasih atas ide-ide Anda, milik saya sejauh ini tampaknya cukup kasar, dan secara komputasi "mahal" atau tidak efisien ...
Jawaban:
Metode sederhana untuk memindahkan lokasi dalam annuli seperti itu mengeksploitasi representasi grid dari jarak ke batas traktat. Dimulai dengan representasi poligonal dari traktus Sensus (yang biasa),
Konversikan itu menjadi batas poligon (lapisan polyline).
Hitung grid jarak Euclidean dengan batas.
Ekstrak jarak Euclidean di lokasi yang diberikan.
Pindahkan setiap lokasi dalam rentang yang diberikan oleh jarak - yang, menurut definisi, adalah maksimum ke batas.
Masing-masing biasanya hanya memerlukan satu perintah dengan GIS, membuat seluruh urutan mudah otomatis dan mudah dilakukan secara manual. Ini adalah perintah yang efisien , karena mereka tidak memerlukan membangun buffer untuk setiap titik (yang biasanya membuat beberapa lusin hingga hampir seribu poin untuk menggambarkan cincin, atau annulus ). Tidak ada uji coba pencarian atau acak yang diperlukan, baik: titik-titik secara langsung dipindahkan dengan jumlah yang dijamin untuk meninggalkan mereka dalam traktus Sensus asli mereka.
Sebagai contoh, saya memindahkan 172.902 lokasi dalam 47 traktat ke arah acak dengan perpindahan yang terdistribusi secara merata antara setengah jarak dan jarak penuh ke batas. Berikut adalah bagian dari satu risalah sebelum pindah:
(kotak kuning tandai lokasi) dan setelah pindah:
(sekarang kotak abu-abu menandai lokasi baru). Operasi total hanya membutuhkan satu atau dua menit (menggunakan GIS yang sudah usang :-).
Dengan membandingkan angka-angka ini dengan seksama, Anda dapat melihatnya
Poin yang sekarang dekat dengan batas (seperti dekat dua danau yang ditampilkan sebagai "lubang" putih pada gambar-gambar ini) harus selalu dekat dengan batas.
Poin yang jauh dari batas cenderung bergerak jauh.
Akibatnya, suatu titik yang dekat dengan batas kemungkinan berasal (tetapi tidak tentu) berasal sangat dekat, sedangkan titik yang jauh dari batas kemungkinan berasal dari tempat lain yang jauh dari batas. Kedua kecenderungan ini jauh dari acak: mereka dapat (cukup mudah) dieksploitasi oleh seseorang yang ingin menembus privasi yang ingin dicapai oleh gerakan ini.
Metode yang lebih baik akan membuat koneksi antara lokasi akhir dan awal lebih renggang dan lebih acak. Paling tidak, poin harus dipindahkan dalam lingkungan yang cukup besar daripada dalam lingkungan dengan ukuran yang bervariasi (dan mungkin kecil secara sewenang-wenang). Gerakan seperti itu tidak mudah dilakukan dengan kisi-kisi, karena biasanya mereka memerlukan beberapa percobaan dan kesalahan: Anda menghasilkan banyak titik acak dalam lingkungan dari setiap titik asli dan memilih yang pertama yang terletak di dalam saluran Sensus yang sama. Itu adalah loop yang melibatkan (1) gerakan acak dan (2) penyelidikan point-in-polygon. Kedua operasi cepat, tetapi ini membutuhkan sedikit pemrograman untuk mengimplementasikan loop.
(Dalam komentar pada pertanyaan, saya memberikan tautan ke beberapa studi tentang metode yang digunakan untuk menyamarkan data lokasi untuk tujuan privasi.)
sumber
Saya hanya ingin menguji donat Anda di PostGIS
Saya mencobanya di PostGISonline.
Untuk melakukan tes yang sama Anda pergi ke: http://postgisonline.org/map.php
Ada beberapa poligon yang disebut "properti" cetak:
dan tekan "Map1"
Kemudian Anda dapat menguji kode donat dengan menyalin di bawah ini ke textarea dan tekan "map2" (maka properti-peta akan tetap):
Itu akan memberi Anda hasil sesuatu seperti:
sumber
Semoga solusi Python ini akan membantu Anda. Alur kerja umum adalah sebagai berikut:
sumber