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();
}