আরকজিআইএসের একটি পৃথক পয়েন্ট থেকে দূরত্বের ভিত্তিতে পয়েন্টের একটি গ্রুপের শতাংশ (75%) নির্বাচন করছেন?


9

এটি আর্কজিআইএস নির্দিষ্ট।

আমার 2 পয়েন্টের শেফফাইল রয়েছে Aএবং Bপ্রথমটি ( A) হ'ল একক পয়েন্ট যা ল্যাট দীর্ঘ, দ্বিতীয়টি ( B) একাধিক পয়েন্ট (12 কেটের বেশি) যা প্রতিটি তাদের ল্যাট এবং লম্বা ধারণ করে। আমি যা করার চেষ্টা করছি তা হ'ল শেফফাইলের Bদূরত্বের ভিত্তিতে শেফফিলের পয়েন্টগুলির 75% নির্বাচন স্বয়ংক্রিয় করা A। অন্য কথায় আমি Bশেফফাইলের Aএক পয়েন্টের নিকটতম shape৫% শেফফাইল পয়েন্ট নির্বাচন করতে চাই ।


একটি প্রোগ্রামেটিক সমাধান কি গ্রহণযোগ্য?
কर्क কুইকেনডাল

বিটিডাব্লু, আমি অনুরোধ করেছি যে এসরি শেপফিল্ডটি একটি কাস্টম আইটিবেলসোর্টক্যালব্যাকে ব্যবহার করার অনুমতি দিন তবে তাকে বলা হয়েছিল যে এর কোনও যৌক্তিকতা নেই। এই ব্যবহারের কেস অন্যথায় প্রদর্শন করে।
কर्क কুইকেনডাল

@ কির্ক কুইকেনডাল হ্যাঁ একটি প্রোগ্রামেটিক সমাধানটি আসলেই অগ্রাধিকার পাবে কারণ এটি এমন একটি প্রক্রিয়া যা আমাকে 1 কে বারেরও বেশি বার করতে হবে। আমার মোটামুটি 1200 পৃথক পয়েন্ট রয়েছে এবং এই পয়েন্টগুলির প্রতিটিটির চারপাশে গড়ে 12 কে পয়েন্ট সহ একটি অন্য শেফফাইল রয়েছে। তাদের সকলের জন্য কাছের 75৫% আশেপাশের পয়েন্টগুলি সহজেই নির্বাচন করার জন্য আমার একটি উপায় বের করতে হবে। এটি ম্যানুয়ালি করা কেবল প্রশ্নের বাইরে।
ফুরলং

সম্ভবত এই মন্তব্যটি কোনও মন্তব্যের যথাযথ সুযোগের বাইরে, তবে কখন এবং কেন এই ধরনের বিশ্লেষণ কার্যকর হবে? এটি আমার নিজস্ব বর্ণনার জন্য; আমার আলস্যতা ক্ষমা করুন।
নাথানাস

1
পরিসংখ্যান সংক্রান্ত সফ্টওয়্যার ব্যবহার বিবেচনা করুন। আপনি যদি মার্জ করার সময় একটি সোর্স আইডি ক্ষেত্র তৈরি করে সমস্ত 1200 শেফফিলগুলি একত্রিত করতে চান তবে আপনি সংশ্লিষ্ট কেন্দ্রীয় পয়েন্ট স্থানাঙ্কগুলিতে যোগ দিতে এবং সমস্ত 1200 * 12 কে = 14.4M দূরত্ব গণনা করতে পারেন। আপনার এখন যা দরকার তা উত্স আইডির মাধ্যমে দূরত্বের 75 তম শতাংশের তালিকা: যা স্টাটা (বাণিজ্যিক) বা আর (মুক্ত উত্স) এর সাথে প্রায় দশ সেকেন্ড সময় নিতে পারে। (আপনি যদি এর জন্য আরকিজিআইএস ব্যবহার করেন তবে আমাদের জেনে নিন যে এটি গণনার জন্য কতটা সময় নেয়: :-)
হোবার

উত্তর:


5

আপনি শেফফাইল এ তে একাধিক রিং বাফার তৈরি করতে পারেন এবং তারপরে বি আকারে ফাইল করার জন্য বাফারের একটি স্থানিক সংযোগ করতে পারেন যখন আপনি বহুভুজ এবং পয়েন্টগুলির একটি স্থানিক জোড় করেন, আপনি বৈশিষ্ট্যের প্রতিটি বহুভুতে পয়েন্টের সংখ্যার একটি গণনা পাবেন যোগদানের টেবিল তারপরে, বাফারগুলির মধ্যে পয়েন্টগুলির মোট সংখ্যা পরীক্ষা করে আপনি শেফফাইল বিতে পয়েন্টগুলির 75% এর মধ্যে পেতে পারেন

পাইথনে স্ক্রিপ্ট করার জন্য কিছুটা আলাদা পদ্ধতি হবে, এবং একটি লুপে 75% পরীক্ষা করে দেখুন, তবে এটি যদি একবারের হিসাবের বাইরে হয় তবে আপনার এটির প্রয়োজন হবে না।


4
এ থেকে বি এর একটি স্থানিক সংযোগ সম্পাদন করা, ফলস্বরূপ [দূরত্ব] ক্ষেত্রের তৃতীয় কোয়ার্টাইল গণনা করা এবং সেই দূরত্বের চেয়ে কম সমস্ত রেকর্ড নির্বাচন করা সহজ, দ্রুত এবং আরও নির্ভুল হবে।
শুশুক

আমি জানি না যে স্থানিকভাবে পয়েন্টগুলিতে যোগদান করা সম্ভব হয়েছিল! আমি সম্মত, এটি করার আরও ভাল উপায় এটি হবে।
djq

@ অ্যান্ডি বিপরীতে, যোগদানটি একটি নিকটতম-পয়েন্টের সম্পর্ক। এটি মোটেও কোনও ট্যাবুলেটেড বৈশিষ্ট্যগুলির ভিত্তিতে নয়। এছাড়াও, আর্ক * সফ্টওয়্যারে (আরকভিউ 2 এ ফিরে যাওয়া), যোগদানের ফলে দূরত্বটি স্বয়ংক্রিয়ভাবে গণনা করা হয়।
হোবার

1
@ হুবুহু, আমি জানি! অতএব প্রত্যাহারযোগ্য (মুছে ফেলা বিবৃতি!) আমি ধরে নিয়েছি আপনি এটি অ্যাট্রিবিউট টেবিলের সাথে যুক্ত হতে পারেন (এবং নিজেই দূরত্বটি গণনা করতে পারেন) তবে প্রসঙ্গের ভিত্তিতে এটি অপ্রয়োজনীয় হবে। আমি যে বিন্দুটি পুনরাবৃত্তি করতে চাই তা অনুমান করে যে এটি কেবল 1 পয়েন্টের মধ্যে দূরত্ব গণনা করা হচ্ছে, কোনও লুপিং বা বাফার বা পুনরুক্তি পদ্ধতি প্রয়োজনীয় নয়।
অ্যান্ডি ডব্লিউ

1
@ ফারলং আপনি যদি স্থানীয়ভাবে যোগদানের উদাহরণটি পড়েন: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… আপনি কীভাবে অজগরটি চালাবেন তার একটি ধারণা পেতে পারেন। তারপরে, এটি অ্যাট্রিবিউট টেবিলের মধ্য দিয়ে চলার এবং আপনার মানদণ্ডের সাথে মেলে এমন মানগুলি বেছে নেওয়ার বিষয়
djq

4

1200 পয়েন্টের জন্য (বা এমনকি 12 এম পয়েন্ট বলতেও কি?) আমি কেবল এগুলি জেনেরিক সংগ্রহ হিসাবে মেমরির মধ্যে রেখেছি - এই ক্ষেত্রে তালিকাগুলির তালিকা অনুসারে বাছাই করা তালিকা । আপনি যখন মূল পয়েন্ট থেকে একই দূরত্বে একাধিক পয়েন্টের সাথে কোনও অবস্থাতে চলে যান তখন কেবল পয়েন্টগুলি এড়িয়ে যাওয়ার মাধ্যমে এটি সরল করা যায়। এছাড়াও, অভিনয়ের জন্য, একটি ব্যবহারের বিষয়ে বিবেচনা hashtable এর পরিবর্তে একটি SortedList, এবং একবার সমস্ত দূরত্বের ঢোকাতে পর বাছাই। যদিও কোডটির আরও কয়েকটি লাইন লাগবে (?)।

এটি পরীক্ষা করার জন্য আমার কাছে সময় ছিল না, তবে এই সি # আপনাকে শুরু করতে পারে:

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 (সরঞ্জামটির "কাছাকাছি বৈশিষ্ট্যগুলি" পরামিতি) পর্যন্ত আপনার বৈশিষ্ট্যগুলি থেকে দূরত্ব গণনা করতে পয়েন্ট দূরত্ব সরঞ্জামটি ব্যবহার করুন ।
  2. গণনা করা দূরত্বে টেবিলটি সাজান।
  3. আউটপুট টেবিলের প্রথম ecti%% আপত্তি নির্বাচন করুন ("ইনপুট_এফআইডি" কলাম) এবং বৈশিষ্ট্য শ্রেণি বিতে মূল বৈশিষ্ট্যগুলি থেকে আপনার পছন্দটি তৈরি করতে সেগুলি ব্যবহার করুন

2

আমি কয়েক বছর আগে এই সমস্যা ছিল। আমি ডেটাটিকে 'ফ্ল্যাট ডেটা' হিসাবে রাখা আরও সহজ করে পেয়েছি, সমস্ত ডেটা লুপ করে এবং ম্যানুয়ালি দূরত্বের গণনা করে, তারপরে শীর্ষ 75% নিয়েছি (আমি আসলে শীর্ষে 10% রেখেছি)। আমি তখন তাদের দূরত্ব গণনাগুলি ব্যবহার করে আরকিআইএমএসে একই কাজ করেছি এবং এটি আরও অনেক বেশি সময় নিয়েছে।

বাফারিং একটি বিশাল ওভারহেড, তবুও গণিতের গণনা একটি 'পিটার ফোর্ট'। আপনি যদি 12 কে পয়েন্ট বাফার করেন তবে আমার মনে হয় আপনার পারফরম্যান্স সংক্রান্ত সমস্যা হবে।


আমি [@ ম্যাপের্জ] মন্তব্যগুলি মুছে ফেলেছি - আধুনিক সরঞ্জামের গাইডলাইনগুলি এই পোস্টটিকে পতাকাঙ্কিত করেছে কারণ এটি অর্থহীন দ্বন্দ্বের মধ্যে অবনতি হয়েছে ...
ম্যাপারজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.