แยกขอบเขตออกจากเลเยอร์ที่มีรายละเอียดใน ArcGIS Desktop หรือ QGIS?


10

เป็นไปได้ไหมที่จะส่งคืนขอบเขต (นอก) ขอบเขตของชั้นรูปหลายเหลี่ยม?

สมมติว่าคุณมีแผนที่ของสหรัฐอเมริกาสำหรับความเรียบง่ายแบ่งออกเป็นระดับเขตเป็นไปได้หรือไม่ที่จะส่งคืนแผนที่ขอบเขตของทั้งประเทศจากแผนที่นั้น


ดังนั้นในกรณีตัวอย่างของสหรัฐอเมริกาคุณหมายถึงได้ร่างของรัฐไม่ใช่กล่องขอบเขตใช่ไหม? ถ้าเป็นเช่นนั้นแล้วการละลายของชั้นเขต?
Chad Cooper

@Chad Cooper - เมื่อฉันละลายเลเยอร์ฉันยังคงมีบางบรรทัดแสดงขึ้นสำหรับมณฑลและรัฐ
dassouki

คำตอบ:


6

คุณสามารถทำการยุบบนเลเยอร์เขต (ต้องแน่ใจว่ามีเพียงมณฑลที่คุณต้องการยุบที่เลือกไว้)


ฉันได้รับบางบรรทัดภายในยังคงปรากฏขึ้นในการละลาย
dassouki

3
คุณสามารถบัฟเฟอร์สองครั้งเพื่อกำจัดบรรทัดภายในได้หรือไม่? ออกไปเพื่อ "กิน" เส้นจากนั้นกลับเข้ามาเพื่อเรียกคืนขนาดดั้งเดิม
mwalker

ด้วยเหตุผลบางอย่างนี้ใช้งานได้ ฉันรู้ว่ามันเป็น "แฮ็ค" ของการแก้ปัญหา แต่นี่เป็นทางออกเดียวที่กำจัดเส้น
dassouki

1
+1 นี่เป็นทางออกที่ดีจริงๆ มันทำงานได้โดยรองรับ slivers ขนาดเล็กและเหลื่อมกันในรูปหลายเหลี่ยมส่วนประกอบ (และยังเอาชนะข้อบกพร่องโดยธรรมชาติจำนวนมากในซอฟต์แวร์ด้วย
whuber

1
ฉันใช้คำแนะนำของ mwalker ในการบัฟเฟอร์ออกมาฉันหวังว่าคุณจะรวมมันไว้ในคำตอบของคุณ
dassouki

4

คุณสามารถใช้โมดูล GRASS: v.dissolve คุณจะต้องนำเข้าข้อมูลของคุณไปยัง GRASS เท่านั้น นี่คือการส่งข้อมูลของคุณไปยัง Grass จากหน้าจอ QGis


3

อนุญาตให้ฉันเสียบโปรเจคของฉันเอง ... Boundary Generatorจะให้ทั้งขอบเขตภายนอกและภายในของรูปหลายเหลี่ยมทุกรูปแบบ

ขอบเขตภายในมีการระบุด้วย FID สำหรับรูปหลายเหลี่ยมสองรูปแต่ละรูปที่ใช้เส้นขอบนั้น ขอบเขตภายนอกควรมี FID เป็นศูนย์สำหรับหนึ่งในสองแห่งนั้นจึงง่ายต่อการเลือกจากผลลัพธ์เต็มรูปแบบ

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

มันยังอยู่ในอัลฟาและไม่นานหลังจากที่ฉันได้ทำการอัพเดท ฉันชอบที่จะได้ยินว่ามันทำงานได้ดีสำหรับคุณ!


2
 public static IPolygon getPolygonFromLayer(ILayer layer)
{
            IFeatureLayer FLayer = layer as IFeatureLayer;
            IFeatureClass FClass = FLayer.FeatureClass;
            return polygonMerge(FClass);
}

   private static IPolygon polygonMerge(IFeatureClass featureClass)
        {
            if (featureClass == null) return null;
            IGeoDataset geoDataset = featureClass as IGeoDataset;

            //You can use a spatial filter to create a subset of features to union together. 
            //To do that, uncomment the next line, and set the properties of the spatial filter here.
            //Also, change the first parameter in the IFeatureCursor.Seach method.
            //ISpatialFilter queryFilter = new SpatialFilterClass();

            IGeometry geometryBag = new GeometryBagClass();

            //Define the spatial reference of the bag before adding geometries to it.
            geometryBag.SpatialReference = geoDataset.SpatialReference;

            //Use a nonrecycling cursor so each returned geometry is a separate object. 
            IFeatureCursor featureCursor = featureClass.Search(null, false);

            IGeometryCollection geometryCollection = geometryBag as IGeometryCollection;
            IFeature currentFeature = featureCursor.NextFeature();

            while (currentFeature != null)
            {
                //Add a reference to this feature's geometry to the bag.
                //Since you don't specify the before or after geometry (missing),
                //the currentFeature.Shape IGeometry is added to the end of the geometryCollection.
                object missing = Type.Missing;
                geometryCollection.AddGeometry(currentFeature.Shape, ref missing, ref missing);
                currentFeature = featureCursor.NextFeature();
            }

            // Create the polygon that will be the union of the features returned from the search cursor.
            // The spatial reference of this feature does not need to be set ahead of time. The 
            // ConstructUnion method defines the constructed polygon's spatial reference to be the 
            // same as the input geometry bag.
            ITopologicalOperator unionedPolygon = new PolygonClass();
            unionedPolygon.ConstructUnion(geometryBag as IEnumGeometry);

            return unionedPolygon as IPolygon;
        }

    }

2

เส้นที่คุณได้รับเมื่อคุณยุบเพราะขอบเขตไม่ราบรื่น

โดยไม่คำนึงถึงผลิตภัณฑ์ซอฟต์แวร์ให้ทำดังต่อไปนี้:

ทำบูรณาการ ข้อความแสดงแทน

จากนั้นทำละลาย ข้อความแสดงแทน


ฉันลองมาหลายครั้งแล้ว แต่มันก็ไม่ได้ผล :( ฉันสูญเสียรูปหลายเหลี่ยมไปเรื่อย ๆ ฉันใช้ความอดทนน้อยมากและมีขนาดใหญ่มากเช่นกัน
dassouki

1

ดูเหมือนว่าตัวอย่างของBounding Containers ที่โพสต์บน arcgis.comจะใช้ได้กับสิ่งที่คุณต้องการ


นี่เป็นความคิดที่ดี แต่วิธีแก้ปัญหานั้นไม่น่าจะใช้ได้กับแฟชั่นนี้ มันมีวัตถุประสงค์เพื่อให้ข้อมูลทางเรขาคณิตเพิ่มเติมเกี่ยวกับคุณสมบัติโดยการหาสมาชิกที่เล็กที่สุดของคลาสของรูปร่างที่มีคุณสมบัติเช่นสี่เหลี่ยมวงกลมวงรีหรือรูปหลายเหลี่ยมนูน ผลลัพธ์จะเป็นหนึ่งในรูปร่างที่มีอยู่เสมอ โดยทั่วไปแล้วจะไม่ตรงกับรูปร่างดั้งเดิมยกเว้นว่าขอบเขตนั้นมีรูปร่างที่ต้องการอยู่แล้ว
whuber

1

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันคิดว่าคำตอบที่ฉันเพิ่งค้นพบได้รับการแนะนำมาตั้งแต่ก่อนหน้านี้ดังนั้นฉันจึงแบ่งปันให้กับผู้ที่พบสิ่งนี้ในการค้นหา

QGIS (ตั้งแต่รุ่น 2.14 เป็นอย่างน้อย) มี "Fill Holes" ในกล่องเครื่องมือการประมวลผลภายใต้วิธีการทางภูมิศาสตร์ของ QGIS> เครื่องมือเรขาคณิต Vectory ฉันพบว่ารูปร่างที่ละลายแล้วเรียกใช้ Fill Holes ด้วยพารามิเตอร์พื้นที่สูงสุดตั้งค่าที่สูงมากแก้ปัญหานี้


0

คุณอาจกำลังมองหาสิ่งที่เคยเรียกว่าฟังก์ชั่น DROPLINE

แม้ว่าจะไม่รอดจากการเปลี่ยน ArcInfo Workstation เป็น ArcGIS Desktop แต่ขณะนี้มีแนวคิด ArcGIS ที่จะกู้คืน:

มันจะดีถ้ามีตัวเลือกในการดรอปบรรทัดระหว่างรูปหลายเหลี่ยมที่มีค่าเดียวกันสำหรับเขตข้อมูลที่ระบุ ฟังก์ชั่นนี้เคยใช้งานได้ใน ArcPlot เป็นคำสั่ง DROPLINE และใช้กันอย่างแพร่หลายเพื่อหลีกเลี่ยงการสร้างชุดข้อมูลใหม่ด้วยคำสั่ง dissolve


0

คุณสามารถใช้ST_UNIONฟังก์ชันใน PostGIS จาก QGIS DB Manager เพื่อรวมรูปหลายเหลี่ยมทั้งหมดในเลเยอร์ (หรือหลาย ๆ กลุ่มของรูปหลายเหลี่ยมเป็นรูปหลายเหลี่ยมขนาดใหญ่) จากเอกสารประกอบ:

Variant 2 เป็นฟังก์ชั่นรวมที่ใช้ชุดของรูปทรงเรขาคณิตและสหภาพใน ST_Geometry เดียวทำให้ไม่เกิดการตัดกัน

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