Minimierung der Anzahl dynamischer Seiten zum Zuordnen verstreuter Punkte mit ArcGIS Desktop?


10

Von Zeit zu Zeit muss ich ein Kartenbuch erstellen, um Sehenswürdigkeiten zu zeigen. Erster Schritt zum Erstellen von Seiten mit regulären Maschen:

Geben Sie hier die Bildbeschreibung ein

Die Lösung gefällt mir nicht, weil a) einige Seiten mit einzelnen Punkten (z. B. Seite 25) am Rand sitzen und b) zu viele Seiten.

Das erste Problem lässt sich einfach mit Code beheben. - Verschieben Sie das Rechteck der Seitenausdehnung in die Mitte der relevanten Punktausdehnung:

Geben Sie hier die Bildbeschreibung ein

Ich mag es immer noch nicht, es sieht sehr voll aus, weil die Anzahl der Seiten gleich bleibt. Denken Sie daran, dass es sich bei allen um tatsächliche A3-Papierseiten in mehreren Kopien des Berichts handelt!

Also habe ich einen Code gekocht, der die Anzahl der Seiten reduziert. In diesem Beispiel von 45 bis 34.

Geben Sie hier die Bildbeschreibung ein

Ich bin mir nicht sicher, ob dies das beste Ergebnis ist, das erzielt werden kann.

Was ist die beste Strategie (Pseudocode, Veröffentlichung, Python-Bibliothek), um durch Punkte zu mischen, um die Anzahl der Rechtecke mit der angegebenen Größe zu minimieren und alle Punkte zu erfassen? Sicherlich hat es jemand in der Spieltheorie, der Militärkunst oder der Fischereiindustrie entdeckt

Dies ist eine Aktualisierung der ursprünglichen Frage:

Dies zeigt den tatsächlichen Umfang und die erforderliche Seitengröße:

Geben Sie hier die Bildbeschreibung ein

Näherer Zoom mit 10 von 164 Seiten:

Geben Sie hier die Bildbeschreibung ein

Beispielpunkt-Feature-Class

Die Rechteckgröße kann sich ändern, sobald sie innerhalb der Grenzen bleibt, dh kleiner ist in Ordnung.


2
Meiner Meinung nach ist das normale Netz die beste Option. Kartenleser erwarten so etwas, weil sie daran gewöhnt sind. Die anderen Optionen sind überfüllt und meiner Meinung nach verwirrend. Es gibt sicherlich Optimierungsalgorithmen, die das tun, was Sie wollen, aber ich glaube nicht, dass Ihr Publikum sie schätzen wird. +1, weil ich schätze, was Sie versuchen zu tun. Eine Möglichkeit, die Anzahl der Seiten zu verringern, besteht darin, den Maßstab zu ändern.
Fezter

Ich stimme Fezter größtenteils zu. Es gibt Fälle, in denen ein nicht fortlaufendes Kartenbuch seinen Platz hat und ich interessiert bin, Antworten zu sehen (sogar Ihren aktuellen Code, wenn Sie ihn teilen möchten). Zum Beispiel ein Buch mit Trails, in dem Sie jeden Trail auf einer eigenen Karte haben möchten und sich nicht darum kümmern möchten, die anderen zu zeigen (obwohl Sie möglicherweise immer noch eine kleinere Karte im kleineren Maßstab möchten, in der alle in relativer Position angezeigt werden). Einfach mal bei Ihrem Beispiel Bilder , die ich in diesem Fall denken Sie würde eine kontinuierliche Abdeckung zwischen den Seiten wollen, auch wenn es Extras bedeutet, es sei denn , die Punkte eine inhärente Gruppierung Eigenschaft.
Chris W

@Fezter, reguläres Netz funktioniert, wenn die Seitengröße mit dem Gesamtumfang vergleichbar ist. Dies und die Änderung des Maßstabs sind hier nicht der Fall
FelixIP

1
@ MichaelMiles-Stimson, was ich mit Avenue gemacht habe, ist in Python machbar. Verwendeter Former, weil in Geometriespielen Former immer noch überlegen ist. Wählen Sie einen Punkt, suchen Sie den nächsten Nachbarn in Manhattan, erstellen Sie einen Mehrpunkt und ermitteln Sie die Ausdehnung. Beenden Sie, wenn über Umfang. Gruppiert aus der ursprünglichen Liste entfernt, fahren Sie mit dem Verbleib fort. Ich fand die Sortierreihenfolge wichtig, versuchte sie zu ändern. Sehr kleiner Unterschied ...
FelixIP

1
Ja, es ist in Python mit erheblichem Aufwand machbar. Beim Umgang mit Geometrien bevorzuge ich ArcObjects in C #. Wie Chris sagte, sehen sie schon ziemlich minimal aus, warum bleiben Sie nicht bei dem, was Sie haben, und nennen es erledigt.
Michael Stimson

Antworten:


4

Dies ist nicht die Antwort, ich dachte nur, ich poste eine Python-Lösung für diejenigen, die interessiert sind:

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

hat es kürzlich für die Umfrageplanung angewendet:

Geben Sie hier die Bildbeschreibung ein

AKTUALISIEREN:

Es scheint, dass für einige Muster, die sich zuerst mit Streupunkten befassen, der richtige Weg ist. Ich habe 'Convex Hull'-Peeling verwendet, um sie zu identifizieren, Idee von Whuber, kann keinen Beitrag finden, sorry.

Geben Sie hier die Bildbeschreibung ein


Ist dies der Beitrag von @whuber, den Sie gesucht haben? gis.stackexchange.com/a/161855/115
PolyGeo

Ja ist es. Früher habe ich Punkte sortiert, bevor die "Jagd" begann. Ich werde morgen meine eigene Antwort aktualisieren. Nicht einfach ohne Desktop
FelixIP

2

Dies sieht aus wie eine geometrische Version des Problems der maximalen Abdeckung, die eng mit dem Problem der festgelegten Abdeckung zusammenhängt , und diese beiden sind NP-vollständig.

Um es zu lösen, könnte man eine Annäherung verwenden. Ich würde den folgenden Algorithmus ausprobieren und er scheint perfekt zu funktionieren. Obwohl wir aufgrund der Komplexität des Problems nicht die beste Antwort finden können.

  1. Für jeden Punkt werden N = 10 Rechtecke in zufälligen Abständen erzeugt. Nur um sicherzustellen, dass das Rechteck den Punkt abdeckt (jedes Rechteck hat mindestens einen Punkt und jeder Punkt gehört mindestens einem Rechteck).
  2. Wiederholen, bis alle Punkte abgedeckt sind: Holen Sie sich ein Rechteck, das die maximale Anzahl nicht abgedeckter Punkte abdeckt. Punkte als abgedeckt markieren.

Eine Implementierung dieses Algorithmus nur für Circle finden Sie hier: http://jsfiddle.net/nwvao72r/3/


1
Sie könnten an gis.stackexchange.com/q/227344/115 interessiert sein, wenn Sie es nicht gesehen haben.
PolyGeo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.