เลือกเปอร์เซ็นต์ (75%) ของกลุ่มจุดตามระยะทางจากจุดแยกหนึ่งใน ArcGIS?


9

นี่คือ ArcGIS ที่เฉพาะเจาะจง

ฉันมีรูปร่างของไฟล์ 2 จุดAและBจุดแรก ( A) คือจุดเดียวที่มีความยาวของเส้นรุ้งที่สอง ( B) คือจุดจำนวนมาก (มากกว่า 12k) ที่แต่ละจุดมีความยาวและความยาว สิ่งที่ฉันพยายามจะทำคือการทำงานโดยอัตโนมัติเลือกของ 75% ของเชปBจุด 's Aขึ้นอยู่กับระยะทางจากเชป ในคำอื่น ๆ ที่ฉันต้องการที่จะเลือกที่ใกล้ที่สุด 75% ของ shapefile Bคะแนนเพื่อ Shapefile A's จุดหนึ่ง


วิธีการแก้ปัญหาเชิงโปรแกรมเป็นที่ยอมรับหรือไม่?
Kirk Kuykendall

BTW ฉันขอให้ Esri อนุญาตให้ใช้ Shapefield ในITableSortCallback ที่กำหนดเองแต่ได้รับแจ้งว่าไม่มีเหตุผลสำหรับเรื่องนี้ กรณีการใช้งานนี้แสดงเป็นอย่างอื่น
Kirk Kuykendall

@ Kirk Kuykendall ใช่โซลูชั่นที่เป็นโปรแกรมจะเป็นที่ต้องการเพราะเป็นกระบวนการที่ฉันจะต้องทำซ้ำมากกว่า 1k ครั้ง ฉันมีคะแนนแยกกันประมาณ 1200 คะแนนและแต่ละจุดมีรูปร่างไฟล์อื่นโดยมีคะแนนเฉลี่ยประมาณ 12k รอบ ฉันจำเป็นต้องหาวิธีในการเลือก 75% ที่ใกล้ที่สุดของจุดโดยรอบสำหรับพวกเขาทั้งหมดได้อย่างง่ายดาย การทำด้วยตนเองเป็นเพียงคำถาม
หลา

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

1
พิจารณาใช้ซอฟต์แวร์ทางสถิติ หากคุณจะรวมรูปร่างของไฟล์ 1200 ทั้งหมดให้สร้างฟิลด์รหัสแหล่งที่มาในระหว่างการผสานคุณสามารถเข้าร่วมพิกัดจุดกึ่งกลางที่สอดคล้องกับจุดนั้นและคำนวณระยะทาง 1200 * 12k = 14.4M ทั้งหมด สิ่งที่คุณต้องการคือรายการของระยะทาง 75 เปอร์เซนต์ของระยะทางตามรหัสต้นทาง: ซึ่งจะใช้เวลาประมาณสิบวินาทีกับ Stata (commercial) หรือ R (open source) (หากคุณใช้ ArcGIS ในเรื่องนี้โปรดแจ้งให้เราทราบว่าต้องใช้เวลานานเท่าใดในการคำนวณ :-)
whuber

คำตอบ:


5

คุณสามารถสร้างMultiple Ring Bufferใน shapefile A จากนั้นทำการรวมเชิงพื้นที่ของ Buffer to shapefile B เมื่อคุณทำการรวมเชิงพื้นที่ของรูปหลายเหลี่ยมและจุดคุณจะได้รับจำนวนคะแนนในแต่ละรูปหลายเหลี่ยมในแอตทริบิวต์ ตารางการเข้าร่วม จากนั้นโดยการตรวจสอบจำนวนคะแนนรวมภายในบัฟเฟอร์คุณจะได้รับคะแนน 75% ภายใน Shapefile B

วิธีที่แตกต่างกันเล็กน้อยคือการเขียนสคริปต์นี้ใน Python และตรวจสอบ 75% ในลูป แต่ถ้าเป็นการคำนวณครั้งเดียวคุณอาจไม่จำเป็นต้องทำเช่นนั้น


4
มันจะง่ายขึ้นเร็วขึ้นและมีความแม่นยำมากขึ้นในการดำเนินการรวมเชิงพื้นที่ของ A ถึง B คำนวณควอไทล์ที่สามของฟิลด์ผลลัพธ์ [ระยะทาง] และเลือกระเบียนทั้งหมดน้อยกว่าระยะทางนั้น
whuber

ฉันไม่ทราบว่ามันเป็นไปได้ที่จะเข้าร่วมคะแนนเชิงพื้นที่! ฉันเห็นด้วยนี่จะเป็นวิธีที่ดีกว่ามากในการทำ
djq

@Andy ตรงกันข้ามการเข้าร่วมเป็นจุดสัมพันธ์ที่ใกล้ที่สุด มันไม่ได้ขึ้นอยู่กับคุณสมบัติตารางใด ๆ เลย นอกจากนี้ในซอฟต์แวร์ Arc * (กลับไปที่ ArcView 2) ระยะทางจะคำนวณโดยอัตโนมัติจากการเข้าร่วม
whuber

1
@ เมื่อไรฉันรู้! ดังนั้นคำสั่งที่ถูกดึงกลับ (ถูกลบ!) ฉันคิดว่าคุณสามารถทำได้โดยเข้าร่วมแอตทริบิวต์ตาราง (และคำนวณระยะทางด้วยตัวคุณเอง) แต่นั่นจะไม่จำเป็นเนื่องจากบริบท ฉันเดาว่าจุดที่ฉันอยากจะย้ำคือมันเป็นเพียงการคำนวณระยะทางระหว่าง 1 จุดไม่จำเป็นต้องวนซ้ำหรือบัฟเฟอร์หรือกระบวนการวนซ้ำ
Andy W

1
@Furlong หากคุณอ่านตัวอย่างของ Spatial Join: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//...คุณสามารถรับทราบวิธีการเรียกใช้ในไพ ธ อน จากนั้นเป็นเรื่องของการเรียกใช้ผ่านตารางแอตทริบิวต์และเลือกค่าที่ตรงกับเกณฑ์ของคุณ
djq

4

1200 จุด (หรือแม้กระทั่งถึงจุดพูด 12M?) ฉันต้องการเพียงแค่ใส่ไว้ในหน่วยความจำที่เป็นคอลเลกชันทั่วไป - ในกรณีนี้SortedListของรายการ สิ่งนี้สามารถลดความซับซ้อนได้โดยเพียงแค่ข้ามจุดเมื่อคุณพบกับสถานการณ์ที่มีหลายจุดที่อยู่ห่างจากจุดกำเนิดเดียวกัน นอกจากนี้สำหรับประสิทธิภาพการทำงานให้พิจารณาใช้hashtableแทน 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

สคริปต์การประมวลผล Python เป็นตัวเลือกที่ชัดเจน:

  1. ใช้เครื่องมือPoint Distanceเพื่อคำนวณระยะทางจากฟีเจอร์ของคุณในฟีเจอร์คลาส B (พารามิเตอร์ "ฟีเจอร์การป้อนข้อมูล" ของเครื่องมือ) ไปยังตำแหน่งในฟีเจอร์คลาส A (พารามิเตอร์ "ใกล้ฟีเจอร์" ของเครื่องมือ)
  2. จัดเรียงตารางตามระยะทางที่คำนวณ
  3. เลือก 75% แรกของวัตถุในตารางผลลัพธ์ (คอลัมน์ "Input_FID") และใช้เพื่อทำการเลือกของคุณจากคุณสมบัติดั้งเดิมในคลาสคุณลักษณะ B

2

ฉันมีปัญหานี้เมื่อไม่กี่ปีก่อน ฉันพบว่าการเก็บข้อมูลเป็น 'flat data' ง่ายกว่าการวนรอบข้อมูลทั้งหมดและคำนวณระยะทางด้วยตนเองจากนั้นรับ 75% สูงสุด (จริง ๆ แล้วฉันเก็บไว้ที่ 10% สูงสุด) จากนั้นฉันก็ทำเช่นเดียวกันใน ArcIMS โดยใช้การคำนวณระยะทางและใช้เวลานานกว่านั้นมาก

การบัฟเฟอร์เป็นค่าใช้จ่ายสูงมาก แต่การคำนวณทางคณิตศาสตร์นั้นเป็น 'พินเตอร์มือขวา หากคุณบัฟเฟอร์ 12k คะแนนฉันคิดว่าคุณจะมีปัญหาด้านประสิทธิภาพ


ฉัน [@Mapperz] ลบความคิดเห็น - แนวทางเครื่องมือ mod ตั้งค่าสถานะโพสต์นี้เนื่องจากลดระดับลงในการทะเลาะวิวาทที่ไร้จุดหมาย ...
Mapperz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.