การลดจำนวนหน้าแบบไดนามิกลงในแผนที่จุดที่กระจัดกระจายโดยใช้ ArcGIS Desktop?


10

บางครั้งฉันต้องจัดทำแผนที่เพื่อแสดงจุดที่น่าสนใจ ขั้นตอนแรกในการสร้างหน้าโดยใช้ mesh ปกติ:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่ชอบวิธีแก้ปัญหาเพราะก) มีบางหน้าเว็บที่มีจุดเดียว (เช่นหน้า 25) อยู่ที่ขอบและ b) หน้ามากเกินไป

ปัญหาแรกนั้นง่ายต่อการแก้ไขโดยใช้รหัส - ย้ายสี่เหลี่ยมผืนผ้าของขอบเขตหน้าไปที่กึ่งกลางของจุดที่เกี่ยวข้อง:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันยังคงไม่ชอบมันดูแออัดมากเพราะจำนวนหน้ายังคงเท่าเดิม จำไว้ว่าพวกเขาทั้งหมดกลายเป็นหน้ากระดาษ A3 จริงในรายงานหลายฉบับ!

ดังนั้นฉันจึงจัดทำโค้ดเพื่อลดจำนวนหน้า ในตัวอย่างนี้จาก 45 ถึง 34

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่แน่ใจว่านี่เป็นผลลัพธ์ที่ดีที่สุดที่สามารถทำได้หรือไม่

กลยุทธ์ที่ดีที่สุดคืออะไร (รหัสเทียม, สิ่งพิมพ์, ห้องสมุด Python) เพื่อสับเปลี่ยนจุดเพื่อลดจำนวนสี่เหลี่ยมขนาดที่กำหนดไว้เพื่อจับจุดทั้งหมด แน่นอนว่ามีคนค้นพบมันในทฤษฎีเกมศิลปะการทหารหรืออุตสาหกรรมการประมง

นี่คือการปรับปรุงคำถามเดิม:

สิ่งนี้แสดงขอบเขตและขนาดหน้าจริงที่ต้องการ:

ป้อนคำอธิบายรูปภาพที่นี่

การย่อ / ขยายแสดง 10 จาก 164 หน้า:

ป้อนคำอธิบายรูปภาพที่นี่

คลาสคุณลักษณะจุดตัวอย่าง

ขนาดสี่เหลี่ยมผืนผ้าสามารถเปลี่ยนได้ทันทีที่มันอยู่ในขอบเขตที่ จำกัด เช่นขนาดเล็กก็ดี


2
ในความคิดของฉันตาข่ายปกติเป็นตัวเลือกที่ดีที่สุด ผู้อ่านแผนที่คาดหวังอะไรแบบนั้นเพราะพวกเขาคุ้นเคยกับมัน ตัวเลือกอื่น ๆ นั้นแออัดและในความคิดของฉันทำให้เกิดความสับสน มีอัลกอริธึมที่เหมาะสมที่สุดที่จะทำสิ่งที่คุณต้องการ แต่ฉันไม่คิดว่าผู้ชมของคุณจะประทับใจพวกเขา +1 เพราะฉันขอบคุณสิ่งที่คุณพยายามทำ ในที่สุดวิธีหนึ่งในการลดจำนวนหน้าคือเปลี่ยนขนาด
Fezter

ฉันเห็นด้วยกับ Fezter เป็นส่วนใหญ่ มีบางกรณีที่หนังสือแผนที่แบบไม่ต่อเนื่องมีที่อยู่และฉันจะสนใจดูคำตอบ (แม้แต่รหัสปัจจุบันของคุณหากคุณต้องการแชร์) ตัวอย่างเช่นหนังสือเส้นทางที่คุณต้องการให้แต่ละเส้นทางบนแผนที่ของตัวเองและไม่สนใจที่จะแสดงเส้นทางอื่น (แม้ว่าคุณอาจยังต้องการแผนที่ขนาดเล็กที่มีขนาดเล็กแสดงพวกเขาทั้งหมดในตำแหน่งสัมพัทธ์) เพียงแค่ดูภาพตัวอย่างของคุณฉันคิดว่าในกรณีนี้คุณจะต้องการความครอบคลุมอย่างต่อเนื่องระหว่างหน้าแม้ว่ามันจะหมายถึงความพิเศษยกเว้นในกรณีที่คะแนนมีคุณสมบัติการจัดกลุ่มโดยธรรมชาติ
Chris W

@Fezter ตาข่ายปกติจะทำงานเมื่อขนาดหน้าก็เปรียบได้กับขอบเขตรวมทั้งการเปลี่ยนแปลงนี้และขนาดไม่ได้เป็นกรณีที่นี่
FelixIP

1
@ MichaelMiles-Stimson สิ่งที่ฉันทำโดยใช้ Avenue นั้นสามารถทำได้ใน Python ใช้ในอดีตเพราะในเกมเรขาคณิตอดีตยังคงเหนือกว่า เลือกจุดค้นหาแมนฮัตตันที่อยู่ใกล้ที่สุดสร้างเพื่อนบ้านหลายจุด ออกหากเกินขอบเขต ลบออกจากการจัดกลุ่มจากรายการเดิมดำเนินการต่อด้วยส่วนที่เหลือ ฉันคิดว่าลำดับการเรียงลำดับสำคัญพยายามเปลี่ยน ความแตกต่างน้อยมาก ...
FelixIP

1
ใช่มันเป็นไปได้ในงูหลามด้วยความพยายามอย่างมาก เมื่อจัดการกับรูปทรงเรขาคณิตฉันชอบ ArcObjects ใน C # อย่างที่คริสบอกว่าพวกเขาดูค่อนข้างน้อยแล้วทำไมไม่ยึดติดกับสิ่งที่คุณมีและเรียกมันว่าทำ
Michael Stimson

คำตอบ:


4

นี่ไม่ใช่คำตอบฉันแค่คิดว่าฉันโพสต์โซลูชั่น Python สำหรับผู้ที่สนใจ:

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

ใช้เมื่อเร็ว ๆ นี้สำหรับการวางแผนการสำรวจ:

ป้อนคำอธิบายรูปภาพที่นี่

UPDATE:

ดูเหมือนว่าสำหรับบางรูปแบบการจัดการกับคะแนน 'หลงทาง' ก่อนเป็นวิธีที่จะไป ฉันใช้เปลือกนูนออกมาเพื่อระบุความคิดของคนผิวขาวไม่สามารถหาโพสต์ขอโทษ

ป้อนคำอธิบายรูปภาพที่นี่


นี่คือโพสต์โดย @whuber ที่คุณกำลังมองหาใช่ไหม gis.stackexchange.com/a/161855/115
PolyGeo

ใช่แล้ว. ฉันเคยเรียงลำดับคะแนนก่อนที่จะ "เริ่ม" ตามล่า ฉันจะอัปเดตคำตอบของฉันเองในวันพรุ่งนี้ ไม่ใช่เรื่องง่ายหากไม่มีเดสก์ท็อป
FelixIP

2

ดูเหมือนว่าปัญหาทางเรขาคณิตของปัญหาการปกปิดสูงสุดซึ่งเกี่ยวข้องกับปัญหาการตั้งค่าอย่างใกล้ชิดและทั้งสองอย่างนั้นก็คือ NP-Complete

ดังนั้นเพื่อแก้ปัญหาเราสามารถใช้การประมาณได้ ฉันจะลองอัลกอริทึมต่อไปนี้และดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์ แม้ว่าจะมีความซับซ้อนของปัญหาเราไม่สามารถหาคำตอบที่ดีที่สุด

  1. Foreach Point สร้าง N = 10 rectangles ในระยะทางแบบสุ่ม; เพียงเพื่อให้แน่ใจว่าสี่เหลี่ยมครอบคลุมจุด (สี่เหลี่ยมแต่ละอันมีอย่างน้อยหนึ่งจุดเป็นของมันและแต่ละจุดเป็นอย่างน้อยหนึ่งสี่เหลี่ยม)
  2. ทำซ้ำจนกระทั่งครอบคลุมทุกจุด: รับสี่เหลี่ยมที่ครอบคลุมจำนวนสูงสุดของจุดที่ไม่ได้เปิด ทำเครื่องหมายคะแนนตามที่ครอบคลุม

การใช้อัลกอริทึมนี้เฉพาะสำหรับวงกลมอยู่ที่นี่: http://jsfiddle.net/nwvao72r/3/


1
คุณอาจสนใจในgis.stackexchange.com/q/227344/115หากคุณยังไม่เคยเห็น
PolyGeo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.