ArcGIS Desktop kullanarak dağınık noktaları eşleştirmek için dinamik sayfa sayısını en aza indirgiyor musunuz?


10

Zaman zaman ilgi çekici yerleri göstermek için harita defteri üretmem gerekiyor. Düzenli ağ kullanarak sayfa oluşturmanın ilk adımı:

resim açıklamasını buraya girin

Çözümü sevmiyorum çünkü a) kenarlarında oturan tek noktalı bazı sayfalar (örneğin sayfa 25) ve b) çok fazla sayfa var.

İlk sorun kodu kullanarak düzeltmek kolaydır, - sayfa kapsamındaki dikdörtgeni ilgili noktaların merkezine taşıyın:

resim açıklamasını buraya girin

Hala hoşlanmıyorum, çok kalabalık görünüyor çünkü sayfa sayısı aynı kalıyor. Unutmayın, hepsi raporun birden fazla kopyasında gerçek A3 kağıt sayfaları haline gelir.

Bu yüzden sayfa sayısını azaltan bir kod hazırladım. Bu örnekte 45'den 34'e.

resim açıklamasını buraya girin

Bunun elde edilebilecek en iyi sonuç olup olmadığından emin değilim,

Tüm noktaları yakalamak için verilen boyuttaki dikdörtgenlerin sayısını en aza indirgemek için noktaları karıştırmak için en iyi strateji (sözde kod, yayın, Python kütüphanesi) nedir? Elbette, birisi onu oyun teorisi, askeri sanat veya balıkçılık endüstrisinde keşfetti

Bu orijinal soru için güncelleme:

Bu, gerekli gerçek boyutu ve sayfa boyutunu gösterir:

resim açıklamasını buraya girin

164 sayfadan 10 tanesini gösteren daha yakın zoom:

resim açıklamasını buraya girin

Örnek Nokta Özellik Sınıfı

Dikdörtgen boyutu, sınırlar içinde kaldığı anda değişebilir, yani daha küçük iyidir.


2
Bence düzenli ağ en iyi seçenektir. Harita okuyucuları buna alıştıklarından böyle bir şey bekliyorlar. Diğer seçenekler kalabalık ve bence kafa karıştırıcı. Kesinlikle istediğinizi yapacak algoritmalar var, ancak kitlenizin onları takdir edeceğini sanmıyorum. +1 olsa da, ne yapmaya çalıştığınızı takdir ediyorum. Son olarak, sayfa sayısını azaltmanın bir yolu ölçeği değiştirmektir.
Fezter

Çoğunlukla Fezter'e katılıyorum. Sürekli olmayan bir harita kitabının bulunduğu durumlar vardır ve cevapları görmek isterim (paylaşmak isterseniz mevcut kodunuz bile). Örneğin, her bir patikayı kendi haritasında istediğiniz ve diğerlerini göstermeyi ummadığınız bir parkur kitabı (yine de hepsini göreceli olarak gösteren daha küçük ölçekli tek bir harita isteyebilirsiniz). Sadece bu durumda sizce senin örneğin görüntüleri bakarak olur noktaları doğal bir gruplama özelliği yoksa, bu ekstralar anlamına gelse bile, sayfalar arasında sürekli bir kapsama istiyorum.
Chris W

@Fezter, sayfa boyutu toplam boyutla karşılaştırılabilir olduğunda düzenli örgü çalışır, hem bu hem de ölçek değişikliği burada geçerli değildir
FelixIP

1
@ MichaelMiles-Stimson, Avenue kullanarak yaptığım Python'da yapılabilir. Önceki kullanılan çünkü geometri oyunlarında eski hala üstün. Nokta seçin, en yakın manhattan mesafe komşusunu bulun, çoklu nokta oluşturun, kapsam alın. Büyük ölçüde çıkın. Gruplandırılmış olarak orijinal listeden kaldırıldı, kalanlarla devam edin. Sıralama düzeninin önemli olduğunu düşündüm, değişmeye çalıştım. Çok az fark ...
FelixIP

1
Evet, önemli bir çaba ile python'da yapılabilir. Geometrilerle uğraşırken C # 'da ArcObjects tercih ederim. Chris'in söylediği gibi, zaten oldukça az görünüyorlar, neden sahip olduğunuza sadık kalmıyorsunuz ve yapıyorsunuz.
Michael Stimson

Yanıtlar:


4

Bu cevap değil, sadece ilgilenenler için Python çözümü gönderdiğimi düşündüm:

# ---------------------------------------------------------------------------
# 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()

anket planlaması için son zamanlarda uyguladı:

resim açıklamasını buraya girin

GÜNCELLEME:

Görünüşe göre, ilk önce 'başıboş' noktalarla ilgilenen desenler için gidilecek yol bu. Onları tanımlamak için 'dışbükey gövde' kabuğunu kullandım, whuber fikri, yazı bulamıyorum, üzgünüm.

resim açıklamasını buraya girin


Bu, @whuber'ın aradığınız gönderi mi? gis.stackexchange.com/a/161855/115
PolyGeo

Evet öyle. "Av" başlamadan önce puanları sıralardım. Yarın kendi cevabımı güncelleyeceğim. Masaüstü olmadan kolay değil
FelixIP

2

Bu, Maksimum Kapak Sorununun Set Cover Problemiyle yakından ilişkili geometrik bir versiyonuna benziyor ve bu ikisi NP-Complete.

Yani çözmek için, yaklaşım kullanılabilir. Aşağıdaki algoritmayı denemek istiyorum ve mükemmel çalışıyor gibi görünüyor. Sorunun karmaşıklığı nedeniyle, en iyi cevabı bulamıyoruz.

  1. Öngörme noktası rastgele mesafelerde N = 10 dikdörtgen oluşturur; sadece dikdörtgenin noktayı kapladığından emin olmak için (her dikdörtgenin en az bir noktası ona ve her bir nokta en az bir dikdörtgene ait)
  2. Tüm noktalar kaplanana kadar tekrarlayın: açıkta kalan maksimum nokta sayısını kapsayan dikdörtgen alın. Noktaları örtülü olarak işaretleyin.

bu algoritmanın sadece daire için uygulanması burada: http://jsfiddle.net/nwvao72r/3/


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.