आर्कजीआईएस में एक अलग बिंदु से दूरी के आधार पर अंकों के समूह के प्रतिशत (75%) का चयन?


9

यह आर्कगिस विशिष्ट है।

मेरे पास 2 पॉइंट शेपफाइल्स हैं Aऔर B, पहला वाला ( A) एक सिंगल पॉइंट है, जिसमें एक लेट लॉन्ग होता है, दूसरा ( B) 12 पॉइंट्स से अधिक का एक पॉइंट होता है, जिसमें से प्रत्येक में उनके लेट और लॉन्ग होते हैं। जो मैं करने की कोशिश कर रहा हूं, वह है Bशेपफाइल से दूरी के आधार पर शेपफाइल के 75% अंकों के चयन को स्वचालित करना A। दूसरे शब्दों में, मैं Bशेपफाइल Aके एक बिंदु पर निकटतम 75% शेपफाइल पॉइंट का चयन करना चाहता हूं ।


एक प्रोग्रामेटिक समाधान स्वीकार्य है?
किर्क कुएकेन्डल

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

@ किर्क कुएकेन्डल हाँ एक प्रोग्रामेटिक समाधान वास्तव में पसंद किया जाएगा क्योंकि यह एक प्रक्रिया है जिसे मुझे 1k बार दोहराना होगा। मेरे पास लगभग 1200 अलग-अलग बिंदु हैं और उन बिंदुओं में से प्रत्येक के पास औसत आकार के 12k अंक हैं। मुझे आसानी से उन सभी के लिए निकटतम 75% आसपास के बिंदुओं का चयन करने का एक तरीका जानने की जरूरत है। इसे मैन्युअल रूप से करना केवल सवाल से बाहर है।
फर्लांग

शायद यह टिप्पणी एक टिप्पणी के उचित दायरे से बाहर है, लेकिन ऐसा विश्लेषण कब और क्यों उपयोगी होगा? यह मेरी अपनी व्याख्या के लिए है; मेरे धीरज को क्षमा करो।
नाथानुस

1
सांख्यिकीय सॉफ्टवेयर का उपयोग करने पर विचार करें। यदि आप सभी 1200 शेपफाइल्स को मर्ज करने के लिए थे, तो मर्ज के दौरान स्रोत आईडी फ़ील्ड बनाते हुए, आप संबंधित केंद्रीय बिंदु निर्देशांक में शामिल हो सकते थे और सभी 1200 * 12k = 14.4M दूरी की गणना कर सकते थे। स्रोत आईडी द्वारा दूरी की 75 वीं प्रतिशतता की सूची: आपको स्टैटा (वाणिज्यिक) या आर (ओपन सोर्स) के साथ लगभग दस सेकंड लगेंगे। (आप इस के लिए ArcGIS उपयोग करते हैं, हमें पता कितना समय यह गणना के लिए ले जाता है जाने :-)।
whuber

जवाबों:


5

आप आकृति ए पर एक मल्टीपल रिंग बफर बना सकते हैं , और फिर आकृति बी के लिए बफर का एक स्थानिक जुड़ाव करते हैं। जब आप बहुभुज और बिंदुओं का एक स्थानिक जुड़ाव करते हैं, तो आपको विशेषता में प्रत्येक बहुभुज में बिंदुओं की संख्या की एक संख्या मिलती है। शामिल होने की तालिका। फिर, बफ़र्स के भीतर अंकों की कुल संख्या की जांच करके, आप आकृति बी में 75% अंक प्राप्त कर सकते हैं।

पाइथन में इसे लिखने के लिए थोड़ा अलग तरीका होगा, और एक लूप में 75% की जाँच करें, लेकिन यदि यह एक बार गणना से बंद हो जाए तो आपको इसकी आवश्यकता नहीं हो सकती है।


4
यह ए, बी से एक स्थानिक जुड़ाव करने के लिए सरल, तेज और अधिक सटीक होगा, परिणामी [दूरी] क्षेत्र के तीसरे चतुर्थक की गणना करेगा, और उस दूरी से कम के सभी रिकॉर्ड का चयन करेगा।
whuber

मुझे नहीं पता था कि यह स्थानिक रूप से जुड़ने के लिए संभव था! मैं सहमत हूं, यह इसे करने का एक बेहतर तरीका होगा।
djq

@ और इसके विपरीत, जुड़ाव एक निकटतम-बिंदु संबंध है। यह किसी भी सारणीबद्ध विशेषताओं पर आधारित नहीं है। इसके अलावा, आर्क * सॉफ्टवेयर (आर्क 2 में वापस जा रहा है) में शामिल होने के परिणामस्वरूप दूरी स्वचालित रूप से गणना की जाती है।
व्हीबर

1
@ शुभंकर, मुझे पता है! इसलिए हटाए गए बयान (हटाए गए कथन!) मुझे लगता है कि आप इसे विशेषता तालिका में शामिल कर सकते हैं (और खुद दूरी की गणना कर रहे हैं), लेकिन यह अनावश्यक संदर्भ दिया जाएगा। मुझे लगता है कि जिस बिंदु को मैं दोहराना चाहूंगा वह यह है कि यह केवल 1 बिंदु के बीच की दूरी की गणना कर रहा है, कोई लूपिंग या बफ़र या पुनरावृत्त प्रक्रियाएं आवश्यक नहीं हैं।
एंडी डब्ल्यू

1
@Furlong यदि आप स्थानिक जुड़ने के उदाहरण को पढ़ते हैं: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…। तो आप अंदाजा लगा सकते हैं कि इसे अजगर में कैसे चलाना है। फिर, यह विशेषता तालिका के माध्यम से चलने और अपने मानदंडों से मेल खाने वाले मूल्यों को चुनने की बात है
djq

4

1200 अंकों के लिए (या 12M अंक कहने के लिए भी?) मैं उन्हें केवल एक सामान्य संग्रह के रूप में मेमोरी में डालूँगा - इस मामले में सूचियों का एक क्रमबद्ध सूची । जब आप मूल बिंदु से समान दूरी वाले कई बिंदुओं के साथ एक स्थिति में दौड़ते हैं तो इसे केवल स्किपिंग पॉइंट द्वारा सरल बनाया जा सकता है। इसके अलावा, प्रदर्शन के लिए, एक SortedList के बजाय एक हैशटेबल का उपयोग करने पर विचार करें , और सभी दूरी डालने के बाद एक बार छंटाई करें। यह कोड की कुछ और पंक्तियाँ लेगा, हालांकि (?)।

मेरे पास इसका परीक्षण करने का समय नहीं था, लेकिन यह c # आपको मिल सकता है:

private void SelectNTile(string layer1, string layer2, double nTile)
{
    var fLayer1 = FindLayer(ArcMap.Document.FocusMap, "LayerWithLotsofPoints");
    var fLayer2 = FindLayer(ArcMap.Document.FocusMap, "LayerWithOneSelectedPoint");
    IFeature feat = GetSingleFeature(fLayer2);
    var distList = MakeDistList(fLayer1.FeatureClass,(IPoint)feat.ShapeCopy);
    // assume not many points exactly same distance
    var nRecs = (int)(distList.Count * nTile); // nTile would be 0.75 for 75%
    var Oids = new List<int>();
    foreach (KeyValuePair<double, List<int>> kvp in distList)
    {
        Oids.AddRange(kvp.Value);
        if (Oids.Count > nRecs)
            break;
    }
    var fSel = fLayer1 as IFeatureSelection;
    var OidArray = Oids.ToArray();
    fSel.SelectionSet.AddList(Oids.Count, ref OidArray[0]);                
}

private SortedList<double, List<int>> MakeDistList(IFeatureClass fc, IPoint pnt)
{
    var outList = new SortedList<double, List<int>>();
    var proxOp = pnt as IProximityOperator;
    IFeatureCursor fCur = null;
    try
    {
        fCur = fc.Search(null, true); // recycling is faster, we just need OIDs
        IFeature feat;
        while ((feat = fCur.NextFeature()) != null)
        {
            double dist = proxOp.ReturnDistance(feat.Shape);
            if (!outList.ContainsKey(dist))
                outList.Add(dist, new List<int> { feat.OID });
            else
                outList[dist].Add(feat.OID);  // this should rarely happen
        }
    }
    catch
    {
        throw;
    }
    finally
    {
        if (fCur != null)
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(fCur);
    }
    return outList;
}
private IFeature GetSingleFeature(IFeatureLayer fLayer)
{
    var fSel = fLayer as IFeatureSelection;
    if (fSel.SelectionSet.Count != 1)
        throw new Exception("select one feature in " + fLayer.Name + " first");
    var enumIDs = fSel.SelectionSet.IDs;
    enumIDs.Reset();
    IFeature feat = fLayer.FeatureClass.GetFeature(enumIDs.Next());
    return feat;
}
private IFeatureLayer FindLayer(IMap map, string name)
{
    throw new NotImplementedException();
}

4

पाइथन जियोप्रोसेसिंग स्क्रिप्ट एक स्पष्ट पसंद है:

  1. फ़ीचर वर्ग A ("उपकरण के पास" सुविधाएँ "पैरामीटर) के बिंदु पर फ़ीचर वर्ग B (" इनपुट सुविधाएँ "टूल का पैरामीटर) में अपनी सुविधाओं से दूरी की गणना करने के लिए पॉइंट डिस्टेंस टूल का उपयोग करें ।
  2. गणना की गई दूरी द्वारा तालिका को क्रमबद्ध करें।
  3. आउटपुट तालिका ("Input_FID" कॉलम) में ऑब्जेक्ट्स के पहले 75% का चयन करें और फीचर वर्ग बी में मूल सुविधाओं से अपना चयन करने के लिए उन का उपयोग करें।

2

मैं कुछ साल पहले यह मुद्दा था। मुझे डेटा को 'फ्लैट डेटा' के रूप में रखना आसान लगा, सभी डेटा के माध्यम से लूपिंग और मैन्युअल रूप से दूरी की गणना करना, फिर शीर्ष 75% लेना (मैंने वास्तव में शीर्ष 10% रखा)। मैंने तब उनकी दूरी की गणना का उपयोग करते हुए आर्कम्स में भी ऐसा ही किया था और इसमें काफी समय लगा।

बफरिंग एक बहुत बड़ा ओवरहेड है, फिर भी मैथ्स की गणना एक 'पुटर फॉर्स्ट' है। यदि आप 12k अंक बफ़र करते हैं, तो मुझे लगता है कि आपके पास परफ़ॉर्मेंस समस्याएँ हैं।


मैं [@Mapperz] हटाई गई टिप्पणियों - आधुनिक उपकरणों के दिशा निर्देशों के इस पोस्ट को फ़्लैग क्योंकि यह व्यर्थ कलह में अपमानित ...
Mapperz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.