Meminimalkan jumlah halaman dinamis untuk memetakan titik-titik yang tersebar menggunakan ArcGIS Desktop?

10

Dari waktu ke waktu saya harus membuat buku peta untuk menunjukkan tempat menarik. Langkah pertama untuk membuat halaman, menggunakan mesh biasa:

masukkan deskripsi gambar di sini

Saya tidak suka solusinya karena a) ada beberapa halaman dengan titik tunggal (mis. Halaman 25) duduk di tepi dan b) terlalu banyak halaman.

Masalah pertama mudah diperbaiki dengan menggunakan kode, - pindahkan persegi panjang dari luas halaman ke pusat sejauh mana poin-poin yang relevan:

masukkan deskripsi gambar di sini

Saya masih tidak suka, itu terlihat sangat ramai karena jumlah halaman tetap sama. Ingat, semuanya akhirnya menjadi halaman kertas A3 aktual dalam banyak salinan laporan!

Jadi saya sudah memasak kode yang mengurangi jumlah halaman. Dalam contoh ini dari 45 hingga 34.

masukkan deskripsi gambar di sini

Saya tidak yakin apakah ini hasil terbaik yang bisa dicapai,

Apa strategi terbaik (kode semu, publikasi, pustaka Python) untuk mengacak titik-titik untuk meminimalkan jumlah persegi panjang ukuran yang diberikan untuk menangkap semua titik? Tentunya, seseorang menemukannya dalam teori permainan, seni militer atau industri perikanan

Ini adalah pembaruan untuk pertanyaan awal:

Ini menunjukkan tingkat nyata dan ukuran halaman yang dibutuhkan:

masukkan deskripsi gambar di sini

Zoom lebih dekat menampilkan 10 dari 164 halaman:

masukkan deskripsi gambar di sini

Kelas Fitur Poin Contoh

Ukuran persegi panjang dapat berubah begitu tetap dalam batas, yaitu lebih kecil baik-baik saja.

FelixIP
sumber
2
Menurut pendapat saya, jala biasa adalah pilihan terbaik. Pembaca peta mengharapkan sesuatu seperti itu karena mereka sudah terbiasa. Pilihan lainnya penuh sesak dan, menurut saya, membingungkan. Tentu saja ada algoritma pengoptimalan yang akan melakukan apa yang Anda inginkan, tetapi saya rasa audiens Anda tidak akan menghargainya. +1 meskipun karena saya menghargai apa yang Anda coba lakukan. Akhirnya, salah satu cara untuk mengurangi jumlah halaman adalah mengubah skala.
Fezter
Saya sebagian besar setuju dengan Fezter. Ada beberapa kasus di mana buku peta non-kontinu memiliki tempatnya dan saya akan tertarik untuk melihat jawaban (bahkan kode Anda saat ini jika Anda ingin berbagi). Misalnya buku jalur tempat Anda ingin setiap jejak di peta sendiri dan tidak peduli untuk menunjukkan yang lain (meskipun Anda mungkin masih menginginkan peta tunggal skala kecil yang menunjukkan semuanya dalam posisi relatif). Hanya melihat contoh gambar Anda saya pikir dalam hal ini Anda akan ingin cakupan terus menerus antara halaman, bahkan jika itu berarti tambahan, kecuali poin memiliki properti pengelompokan yang melekat.
Chris W
@Fezter, jala biasa berfungsi ketika ukuran halaman sebanding dengan luas total, baik perubahan skala maupun skala ini tidak terjadi di sini
FelixIP
1
@ MichaelMiles-Stimson, apa yang saya lakukan menggunakan Avenue bisa dilakukan dengan Python. Bekas bekas karena dalam permainan geometri mantan masih unggul. Pilih titik, temukan tetangga jarak manhattan terdekat, buat multipoint, dapatkan luasnya. Berhenti jika melebihi batas. Dihapus yang dikelompokkan dari daftar asli, lanjutkan dengan yang tersisa. Saya pikir urutan penyortiran penting, mencoba berubah. Perbedaan yang sangat kecil ...
FelixIP
1
Ya itu bisa dilakukan dalam python dengan usaha yang signifikan. Ketika berhadapan dengan geometri, saya lebih suka ArcObjects dalam C #. Seperti kata Chris, mereka sudah terlihat sangat minim, mengapa tidak bertahan dengan apa yang Anda miliki dan menyebutnya sudah selesai.
Michael Stimson

Jawaban:

4

Ini bukan jawabannya, saya hanya berpikir saya memposting solusi Python bagi mereka yang tertarik:

# ---------------------------------------------------------------------------
# PAGE MAKER
# 
# ---------------------------------------------------------------------------
# Import arcpy module
import arcpy, traceback, os, sys
from arcpy import env

width=650
height=500

try:
    def showPyMessage():
            arcpy.AddMessage(str(time.ctime()) + " - " + message)
    mxd = arcpy.mapping.MapDocument("CURRENT")
    points = arcpy.mapping.ListLayers(mxd,"points")[0]
    pgons = arcpy.mapping.ListLayers(mxd,"pages")[0]

    g=arcpy.Geometry()
    geometryList=arcpy.CopyFeatures_management(points,g)
    geometryList=[p.firstPoint for p in geometryList]
    curT = arcpy.da.InsertCursor(pgons,"SHAPE@")
    while True:
        nPoints=len(geometryList)
        small=[geometryList.pop(0)]
        for p in geometryList:
            small.append(p)
            mPoint=arcpy.Multipoint(arcpy.Array(small))
            ext=mPoint.extent
            cHeight=ext.height
            cWidth=ext.width
            if cHeight>height or cWidth>width:
                small.remove(p)
        mPoint=arcpy.Multipoint(arcpy.Array(small))
        ext=mPoint.extent
        xC=(ext.XMin+ext.XMax)/2
        yC=(ext.YMin+ext.YMax)/2
        LL=arcpy.Point (xC-width/2,yC-height/2)
        UL=arcpy.Point (xC-width/2,yC+height/2)
        UR=arcpy.Point (xC+width/2,yC+height/2)
        LR=arcpy.Point (xC+width/2,yC-height/2)
        pgon=arcpy.Polygon(arcpy.Array([LL,UL,UR,LR]))
        curT.insertRow((pgon,))
        short=filter(lambda x: x not in small,geometryList)
        arcpy.AddMessage('Grabbed %i points, %i to go' %(len(small),len(short)))
        if len(short)==0: break
        geometryList=short[:]
    del mxd
except:
    message = "\n*** PYTHON ERRORS *** "; showPyMessage()
    message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
    message = "Python Error Info: " +  str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()

menerapkannya akhir-akhir ini untuk perencanaan survei:

masukkan deskripsi gambar di sini

MEMPERBARUI:

Tampaknya untuk beberapa pola berurusan dengan poin 'menyimpang' terlebih dahulu adalah cara untuk pergi. Saya telah menggunakan kulit 'cembung lambung' untuk mengidentifikasi mereka, gagasan whuber, tidak dapat menemukan pos, maaf.

masukkan deskripsi gambar di sini

FelixIP
sumber
Apakah ini posting oleh @whuber yang Anda cari? gis.stackexchange.com/a/161855/115
PolyGeo
Ya itu. Saya biasanya mengurutkan poin sebelum "berburu" dimulai. Saya akan memperbarui jawaban saya sendiri besok. Tidak mudah tanpa desktop
FelixIP
2

Ini terlihat seperti versi geometris dari Masalah Cakupan Maksimum yang terkait erat dengan Masalah Set Penutup , dan keduanya adalah NP-Lengkap.

Jadi untuk mengatasinya, seseorang bisa menggunakan pendekatan. Saya akan mencoba algoritma berikut dan tampaknya berfungsi dengan baik. Meskipun karena kompleksitas masalah, kami tidak dapat menemukan jawaban terbaik.

  1. Titik depan menghasilkan N = 10 persegi panjang dalam jarak acak; hanya untuk memastikan bahwa persegi panjang menutupi titik (setiap persegi panjang memiliki setidaknya satu titik miliknya dan setiap titik milik setidaknya satu persegi panjang)
  2. Ulangi sampai semua titik tertutup: dapatkan persegi panjang yang mencakup jumlah maksimum dari poin yang tidak tertutup. Tandai poin sebagai tertutup.

implementasi algoritma ini, hanya untuk lingkaran, ada di sini: http://jsfiddle.net/nwvao72r/3/

Farid Cheraghi
sumber
1
Anda mungkin tertarik pada gis.stackexchange.com/q/227344/115 jika Anda belum melihatnya.
PolyGeo