ArcGIS डेस्कटॉप का उपयोग करके बिखरे बिंदुओं को मैप करने के लिए डायनामिक पेजों की संख्या कम से कम करना?


10

समय-समय पर मुझे रुचि के अंक दिखाने के लिए मैपबुक का उत्पादन करना होगा। नियमित जाल का उपयोग करके, पेज बनाने के लिए पहला कदम:

यहां छवि विवरण दर्ज करें

मुझे समाधान पसंद नहीं है क्योंकि क) एकल बिंदु वाले कुछ पृष्ठ हैं (जैसे पृष्ठ 25) किनारे पर बैठे हैं और ख) बहुत सारे पृष्ठ हैं।

पहला अंक कोड का उपयोग करके ठीक करना आसान है, - प्रासंगिक बिंदु सीमा के केंद्र तक पृष्ठ सीमा की आयत को स्थानांतरित करें:

यहां छवि विवरण दर्ज करें

मुझे अभी भी यह पसंद नहीं है, यह बहुत भीड़ लगती है क्योंकि पृष्ठों की संख्या समान रहती है। याद रखें, वे सभी रिपोर्ट की कई प्रतियों में वास्तविक A3 पेपर पेजों को समाप्त करते हैं।

इसलिए मैंने एक कोड पकाया है जो पृष्ठों की संख्या को कम करता है। इस उदाहरण में 45 से 34 तक।

यहां छवि विवरण दर्ज करें

मुझे यकीन नहीं है कि यह सबसे अच्छा परिणाम है जो हासिल किया जा सकता है,

सभी बिंदुओं पर कब्जा करने के लिए दिए गए आकार आयतों की संख्या को कम करने के लिए अंक के माध्यम से फेरबदल करने के लिए सबसे अच्छी रणनीति (छद्म कोड, प्रकाशन, पायथन पुस्तकालय) क्या है? निश्चित रूप से, किसी ने इसे खेल सिद्धांत, सैन्य कला या मछली पकड़ने के उद्योग में खोजा

यह मूल प्रश्न के लिए अद्यतन है:

यह वास्तविक सीमा और पृष्ठ आकार दिखाता है:

यहां छवि विवरण दर्ज करें

करीब १६४ पृष्ठों में से १० को दर्शाने वाला क्लोजर:

यहां छवि विवरण दर्ज करें

नमूना बिंदु सुविधा वर्ग

जैसे ही यह सीमा के भीतर रहता है, आयत का आकार बदल सकता है, यानी छोटा ठीक है।


2
मेरी राय में नियमित जाल सबसे अच्छा विकल्प है। मानचित्र पाठक कुछ इस तरह की उम्मीद कर रहे हैं क्योंकि वे इसके अभ्यस्त हैं। अन्य विकल्प भीड़ और, मेरी राय में, भ्रामक हैं। निश्चित रूप से एल्गोरिदम का अनुकूलन कर रहे हैं, जो आप चाहते हैं वही करेंगे, लेकिन मुझे नहीं लगता कि आपके दर्शक उनकी सराहना करेंगे। +1 यद्यपि मैं सराहना करता हूं कि आप क्या करने की कोशिश कर रहे हैं। अंत में, पेजों की संख्या को कम करने का एक तरीका पैमाना बदलना है।
Fezter

मैं ज्यादातर Fezter से सहमत हूं। ऐसे मामले हैं जहां एक गैर-निरंतर मानचित्र पुस्तक में अपनी जगह है और मुझे उत्तर देखने के लिए दिलचस्पी होगी (यदि आप साझा करना चाहते हैं तो आपका वर्तमान कोड भी)। उदाहरण के लिए ट्रेल्स की एक पुस्तक, जहाँ आप प्रत्येक ट्रेल को अपने मानचित्र पर चाहते हैं और दूसरों को दिखाने के बारे में परवाह नहीं करते हैं (हालांकि आप अभी भी एक छोटे पैमाने पर सिंगल मैप चाहते हैं, जो उन्हें सभी सापेक्ष स्थिति में दिखा सकता है)। बस अपने उदाहरण छवियों को देख मुझे लगता है कि इस मामले में आप चाहते हैं जब तक अंक एक अंतर्निहित समूह संपत्ति है पृष्ठों के बीच एक सतत कवरेज चाहते हैं, भले ही यह एक्स्ट्रा कलाकार का मतलब है,।
क्रिस डब्ल्यू

@Fezter, नियमित रूप से मेष काम करता है जब पृष्ठ का आकार कुल सीमा तक तुलनीय होता है, यह और पैमाने पर परिवर्तन दोनों यहाँ मामला नहीं है
FelixIP

1
@ MichaelMiles-Stimson, मैंने एवेन्यू का उपयोग करके जो किया है वह पायथन में उल्लेखनीय है। पूर्व का उपयोग किया गया है क्योंकि ज्यामिति के खेल में पूर्व अभी भी बेहतर है। प्वाइंट उठाओ, निकटतम मैनहट्टन दूरी पड़ोसी को ढूंढें, मल्टीपॉइंट बनाएं, सीमा प्राप्त करें। यदि हद से ज्यादा हो तो छोड़ दें। मूल सूची से समूहीकृत हटा दिया गया, शेष के साथ आगे बढ़ें। मैंने सोचा कि क्रमबद्ध क्रम महत्वपूर्ण है, बदलने की कोशिश की। बहुत कम अंतर ...
फेलिक्सिप

1
हाँ यह महत्वपूर्ण प्रयास के साथ अजगर में उल्लेखनीय है। जब मैं ज्यामिति के साथ काम करता हूं तो मैं C # में आर्कोबजेक्ट्स पसंद करता हूं। जैसा कि क्रिस ने कहा कि वे पहले से ही काफी न्यूनतम दिखते हैं, इसलिए जो आपने प्राप्त किया है उससे चिपके नहीं और इसे पूरा करें।
माइकल स्टिम्सन

जवाबों:


4

यह उत्तर नहीं है, मुझे लगा कि मैं दिलचस्पी रखने वालों के लिए पायथन समाधान पोस्ट करता हूं:

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

सर्वेक्षण योजना के लिए इसे हाल ही में लागू किया गया:

यहां छवि विवरण दर्ज करें

अपडेट करें:

ऐसा लगता है कि 'आवारा' बिंदुओं से निपटने वाले कुछ पैटर्न के लिए सबसे पहले जाना है। मैंने उन्हें पहचानने के लिए 'उत्तल पतवार' के छिलके का इस्तेमाल किया है।

यहां छवि विवरण दर्ज करें


क्या यह @whuber द्वारा पोस्ट जिसे आप ढूंढ रहे थे? gis.stackexchange.com/a/161855/115
PolyGeo

हाँ यही है। मैं "शिकार" शुरू करने से पहले अंक सॉर्ट करता था। मैं कल अपना जवाब अपडेट करूंगा। डेस्कटॉप के बिना आसान नहीं है
फेलिक्सिप

2

यह अधिकतम कवरेज समस्या के एक ज्यामितीय संस्करण जैसा दिखता है जो सेट कवर समस्या से निकटता से संबंधित है , और वे दो एनपी-पूर्ण हैं।

तो इसे हल करने के लिए, कोई सन्निकटन का उपयोग कर सकता है। मैं निम्नलिखित एल्गोरिथ्म की कोशिश करूंगा और यह पूरी तरह से काम करता है। यद्यपि समस्या की जटिलता के कारण, हम सबसे अच्छा उत्तर नहीं पा सकते हैं।

  1. फॉर्च्यूनर बिंदु यादृच्छिक दूरी में एन = 10 आयताकार उत्पन्न करता है; बस यह सुनिश्चित करने के लिए कि आयत बिंदु को कवर करती है (प्रत्येक आयत में कम से कम एक बिंदु इसके अंतर्गत है और प्रत्येक बिंदु कम से कम आयत का है)
  2. तब तक दोहराएं जब तक कि सभी बिंदु कवर न हो जाएं: अधिकतम आयत बिंदुओं को कवर करने वाली आयत प्राप्त करें। कवर के रूप में अंक।

केवल सर्कल के लिए इस एल्गोरिथ्म का कार्यान्वयन, यहां है: http://jsfiddle.net/nwvao72r/3/


1
यदि आपने इसे नहीं देखा है तो आप gis.stackexchange.com/q/227344/115 में रुचि ले सकते हैं ।
PolyGeo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.