ใหม่สำหรับ ArcGIS และต้องการคำนวณระยะห่างระหว่างจุดสองจุด“ เมื่อปลาแหวกว่าย”


9

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

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

ฉันใช้ ArcGIS Explorer 2500, ArcGIS สำหรับเซิร์ฟเวอร์ 10.1 SP1 Enterprise และเรากำลังเขียนบริการและเครื่องมือของเราใน C #

ฉันมีอุทกศาสตร์, การสร้างไอพอยท์ แต่มีการสูญเสียว่าจะทำอย่างไรต่อไป!

ความช่วยเหลือใด ๆ ชื่นชมโปรด


1
มี 'ไม่มีคำตอบที่ยอมรับ' ที่นี่ แต่ฉันคิดว่ามันเป็นคำถามที่คล้ายกันมาก: gis.stackexchange.com/questions/33799/…
Mapperz

ระดับความตื่นเต้นของฉันเริ่มขึ้นทันทีจนกระทั่งเขาบอกว่าเขาไม่ใช่โปรแกรมเมอร์ สิ่งนี้ไม่สามารถทำได้โดยใช้เครื่องมือ ฉันมีหน้าต่างเครื่องมือแบบกำหนดเองพร้อมตำแหน่งที่เลือกและรายการเป้าหมาย ฉันต้องการเรียกวิธีการบนเซิร์ฟเวอร์และเติมรายการด้วยระยะทางไปยังแต่ละเป้าหมาย
SASS_Shooter

เป็นชั้นหรือรูปหลายเหลี่ยมอุทกศาสตร์ของคุณ?
Conor

มันเป็นรูปหลายเหลี่ยมที่เราแปลงเป็นแรสเตอร์
SASS_Shooter

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

คำตอบ:


4

ใช้ระยะทางต้นทุนและเครื่องมือเส้นทางของต้นทุนจากส่วนขยายนักวิเคราะห์เชิงพื้นที่

คุณสามารถสร้าง Raster จาก Hydrography Polygons ของคุณ จากนั้นให้แน่ใจว่าเซลล์แรสเตอร์ที่เป็นตัวแทนของน้ำนั้นมีค่าต่ำ (เช่น 1) และเซลล์แรสเตอร์อื่น ๆ จะมีค่าสูง (เช่น 1,000) จากนั้นคุณสามารถใช้แรสเตอร์นี้เป็นแรสเตอร์ระยะทางค่าใช้จ่ายในเส้นทางต้นทุนเครื่องมือ


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

1

ฉันได้ทำสิ่งที่คล้ายกันสำหรับ Centrelines มากกว่าคลองและสายน้ำธรรมชาติ วิธีที่ฉันใช้คือ TIN จุดแบ่งครึ่ง TIN จากนั้นสร้าง TIN ที่สองจากจุดยอดเดิมและ bisectors ข้ามผ่านการใช้อัลกอริทึมของ Dijkstra แก้ไขตัวเลือกทิ้งทันทีที่เห็นได้ชัดว่าพวกเขาจะไม่แก้ปัญหาที่ง่ายที่สุด . การแก้ไขคือบรรทัดสามารถยุติที่จุด 'โซลูชัน' หรือเส้นทางก่อนหน้าควรมีอยู่แล้ว ไม่มีทางออกที่นอกกรอบสำหรับเรื่องนี้และหากคุณไม่ใช่โปรแกรมเมอร์หรืออย่างน้อยก็อยู่ในตำแหน่งที่จะได้รับประโยชน์ที่ดีจากตัวเลือกเดียวของคุณคือการติดตามด้วยออฟเซ็ตลงในฐานข้อมูลภูมิศาสตร์และดูที่ เขตข้อมูล shape_length


TIN = เครือข่ายสามเหลี่ยมที่ผิดปกติเป็นจุดของจุดเชื่อมต่อและจุดเชื่อมต่อที่แต่ละจุดเชื่อมต่อกับเพื่อนบ้านที่ใกล้ที่สุดและไม่มีเส้นตัดกัน สำหรับเรื่องนี้ดูhttp://en.wikipedia.org/wiki/Delaunay_triangulation ฉันไม่ได้ใช้วัตถุ ESRI TIN แทนฉันพบรหัสบางอย่างสำหรับการหารูปสามเหลี่ยมและเก็บไว้ในหน่วยความจำเช่นhttp://www.codeproject.com/Articles/492435/Delaunay-Triangulation-For-Fast-Mesh-Generation .

สำหรับอัลกอริธึมพา ธ ที่สั้นที่สุดโปรดดูที่http://en.wikipedia.org/wiki/Dijkstra 's_algorithm มันมีภาพที่ดี แม้จะมีชื่อที่ซับซ้อนมันค่อนข้างง่ายจริงๆ

จากจุดที่สร้างเส้นผมได้สามเหลี่ยม Delaunay แล้วพบจุดกึ่งกลางของขอบของรูปสามเหลี่ยมแต่ละอัน (เรขาคณิตพื้นฐาน ... ค่าเฉลี่ย X, ค่าเฉลี่ย Y) จากนั้นใส่จุดที่อยู่ภายในรูปหลายเหลี่ยมลงในตาข่ายซึ่งให้ เส้นทางกึ่งกลางและลิงก์ไปยังทุกจุดบนขอบเขต จากนั้นไม่รวมแง่มุมที่ติดตามธนาคารของสายน้ำติดตามเครือข่ายโดยใช้อัลกอริทึมของ Dijkstra และในที่สุดคุณจะพบเส้นทางจากจุด A ไปยังจุด B ที่วิ่งไปตามกึ่งกลางของทางน้ำ จะมีเส้นทางที่เป็นไปได้จำนวนมากดังนั้นฉันจึงเก็บน้ำหนักไว้บน apex แต่ละอันและหยุดเส้นทางเมื่อความยาวสะสมเกินความยาวที่บันทึกไว้แล้วและถ้ามันน้อยกว่าให้อัปเดต apex ด้วยความยาวสะสมที่สั้นลง - นี่เป็นการลดจำนวน เส้นทางที่ถูกติดตามและอาจมีค่อนข้างมาก

อีกวิธีหนึ่งเมื่อ triangulated คุณสามารถเปลี่ยนขอบสามเหลี่ยมเป็นเส้นสองจุดเป็นคลาสคุณลักษณะสร้างเครือข่ายแล้วทำการติดตาม ฉันแน่ใจว่ากิจวัตรการติดตาม ESRI นั้นเร็วกว่าของฉันมาก แต่ฉันมีความต้องการเฉพาะและไม่สามารถแก้ไขได้ด้วยเครือข่ายเรขาคณิต


Michael - ฉันเป็นนักพัฒนา C # ใหม่มากสำหรับ ArcGIS และเครื่องมือการเขียนโปรแกรมของพวกเขา ฉันพบวิธีแก้ปัญหาหนึ่งทางออกโดยใช้ Military Analyst แต่ ESRI ในปัญญาของพวกเขาทั้งหมดกำลังลดลง คุณหมายถึงอะไรโดย TIN เป็นคะแนนและอัลกอริทึม Dyjkstra ใดที่คุณใช้?
SASS_Shooter

1

ฉันจะเพิ่มสิ่งนี้ให้กับทุกคนในอนาคตที่อ่านกระทู้นี้

นี่คือทั้งหมดที่ฉันได้เรียนรู้ในการขุดลงในปัญหานี้และได้รับระยะทางที่สมบูรณ์ระหว่างจุดโทร

ปัญหาแรกของเราเกิดจากลักษณะคงที่ของ RasterCatalog การเปลี่ยนแรสเตอร์ที่เป็นไปตามนี้จะไม่เปลี่ยนแรสเตอร์ภายใน RasterCatalog ปรากฎว่าของเรามีรุ่นโบราณที่ไม่มีที่ไหนเลยใกล้แผนที่ชายฝั่งทะเล เรียนรู้บทเรียน: สร้าง RasterCatalog ใหม่ทุกครั้งที่คุณเปลี่ยน Rasters ตาม

Distance Raster พร้อมตุ้มน้ำหนักเพิ่มกลายเป็นเรื่องยุ่งยากในการทำงาน ดูสถานการณ์ต่อไปนี้: ค่าดั้งเดิมของแรสเตอร์คือ 1 ระยะทางทั้งหมดที่ฉันต้องการดูคือ 117 กม. ขนาดเซลล์คือ 1 เมตร ถ้าแรสเตอร์ตอนนี้มีค่าถ่วงน้ำหนักจาก 48 แล้วระยะทางทั้งหมดที่ฉันต้องการให้ดูกลายเป็น 117 km * 48 !!! ดังนั้นระยะทางในวิธี CostDistance ไม่ใช่ระยะห่างของเซลล์ แต่เป็นระยะทางถ่วงน้ำหนักทำให้เห็นได้ชัดว่าเป็นการเพิ่มมูลค่าในแต่ละเซลล์จนกว่าผลรวมของแต่ละเซลล์ = ค่าที่ส่งผ่านสำหรับระยะทางทั้งหมด แม้ว่าขนาดเซลล์ของตัวเองจะเป็น 1 เมตร !!!

แรสเตอร์ระยะทางทั้งหมดมุ่งเน้นไปที่จุดกำเนิด ดังนั้นเมื่อคุณเรียกรูทีน CostDistance คุณไม่ต้องการรวมจุดกำเนิดในรายการนั้น ถ้าคุณทำคุณจะได้รับหนึ่งจุดด้วยระยะทาง 0 (นี่ยังสนับสนุน ESRI ที่นิ่งงันอยู่)

ในขณะที่วิธีการหลายวิธีใช้ซองจดหมายเพื่อ จำกัด กระบวนการของพวกเขาทั้งสองวิธีที่มีราคาแพงที่สุดตั้งค่าเป็นแรสเตอร์และแยกแรสเตอร์โดยไม่มีพื้นที่ภายในรูปหลายเหลี่ยมละเว้นการตั้งค่าซองจดหมายทั้งหมดโดยอัตโนมัติ น่าเสียดายสำหรับเราเราสามารถทำให้สั้นลงได้โดยการสร้างเซกเมนต์ที่ทับซ้อนกันจำนวนมากและกำหนดเซ็กเมนต์ให้กับพื้นที่ที่บรรจุอยู่ แต่ในการทำเช่นนั้นเราต้องระวัง (ซึ่งยาก) ว่าพื้นที่ปฏิบัติการหลักไม่มีอยู่ในพื้นที่ที่ทับซ้อนกันผิด (กล่าวอีกนัยหนึ่งการซ้อนทับทั้งหมดของเราจะต้องเลือกอย่างระมัดระวังเพื่อไม่ให้มีจุดสนใจหลัก ๆ !) เหตุผลนี้คือเราสำรวจ RasterCatalog เพื่อเลือกแรสเตอร์ที่ถูกต้องตามตำแหน่งที่ Coast Guard เลือกไว้ เพื่อทำให้กระบวนการของเราซับซ้อนขึ้น การทับซ้อนต้องทำให้เราสามารถนำทางได้ไกลถึง 120 กม. จากจุดกำเนิดของเราโดยไม่วิ่งไปตามขอบของแผนที่และไม่ทับซ้อนกับจุดสนใจหลักอื่น ๆ Sheesh

สิ่งอื่น ๆ ที่ฉันได้เรียนรู้คือมันง่ายต่อการคำนวณทางคณิตศาสตร์กับแรสเตอร์ แต่เมื่อคุณต้องการ 'กระตุ้นรู' ในแรสเตอร์ (การอุดตัน) หรือตั้งค่าโดนัทที่มีค่าและด้านในของโดนัทที่มี ค่า 1 (ความล่าช้าเหมือนล็อค) คุณจะได้รับชุดเครื่องมือที่ซับซ้อนและการเรียกใช้ ArcObject ซึ่งนำไปสู่บทเรียนสุดท้ายที่เรียนรู้: ArcObjects ไม่สามารถทำทุกอย่างได้ บางครั้งฉันก็ถูกบังคับให้ทำสิ่งต่าง ๆ ในเครื่องมือที่ช้าและยุ่งยากซึ่งเขียนด้วยภาษาไพ ธ อน ฉันยังได้เรียนรู้ว่าผู้พัฒนาเครื่องมือ ESRI ไม่รู้อะไรเลยเกี่ยวกับการรักษาความมั่นคง บางครั้งพวกเขาใช้ฐานข้อมูลแรสเตอร์ในบางครั้งพวกเขาต้องการแรสเตอร์และบางครั้งพวกเขาก็ต้องการฟีเจอร์เซต และพวกเขาจะไม่ส่งคืนข้อมูลในรูปแบบเดียวกับที่พวกเขาต้องการเป็นอินพุต!

สับสน? ไม่ต้องกังวลมันคือ ESRI

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