arcpy.geometry __geo_interface__ และฟังก์ชัน AsShape (): สูญเสียความแม่นยำและรู


10

ฉันจัดรูปทรงเรขาคณิต arcpy ของฉันเป็น geojson เพื่อที่ฉันจะสามารถ 'ไฮเดรต' พวกมันกลับมาเป็นรูปเรขาคณิตในภายหลังและฉันมีปัญหา 2 อย่างในรอบ:

ปัญหาที่ 1: ความแม่นยำ

    R0 = arcpy.SearchCursor(self.shpTest, "FID=0").next().getValue("Shape")          
    geojson = R0.__geo_interface__                        
    R1 = arcpy.AsShape(geojson)
    self.assertTrue(R0.equals(R1)) <<< THIS FAILS

ถ้าฉันตรวจสอบการเป็นตัวแทนสตริงพิกัดมีการเปลี่ยนแปลงเล็กน้อย:

    geojson2 = R1.__geo_interface__
    print geojson
    print geojson2  

    {'type': 'Polygon', 'coordinates': [[(442343.5516410945, 4814166.6184399202), (442772.17749834526, 4811610.7383281607), (441565.67508534156, 4811499.6131059099), (440772.50052100699, 4814184.7808806188), (442343.5516410945, 4814166.6184399202)]]}
    {'type': 'Polygon', 'coordinates': [[(442343.55169677734, 4814166.6185302734), (442772.17749023438, 4811610.73828125), (441565.67510986328, 4811499.6130981445), (440772.50048828125, 4814184.7808837891), (442343.55169677734, 4814166.6185302734)]]}

ปัญหาที่ 2: หลุม หากรูปหลายเหลี่ยมมีรูgeo_interfaceจะสร้างข้อผิดพลาด:

    R0_WithHoles = arcpy.SearchCursor(self.shpTest, "FID=0").next().getValue("Shape")          
    geojson = R0.__geo_interface__  <<< generates this ERROR:

    File "C:\Program Files\ArcGIS\Desktop10.0\arcpy\arcpy\arcobjects\geometries.py", line 68, in __geo_interface__
        return {'type': 'Polygon', 'coordinates': [[(pt.X, pt.Y) for pt in part] for part in self]}
    AttributeError: 'NoneType' object has no attribute 'X'

ความคิดใด ๆ เกี่ยวกับวิธีการแก้ปัญหาเหล


ใช่เพิ่งวิ่งข้ามหมายเลข 2 ตัวเอง และดูเหมือนจะไม่รักมากสำหรับหัวข้อนี้
valveLondon

สิ่งนี้ยังคงพังอยู่ใน arcpy ใน ArcGIS 10.1 - คงจะดีถ้า ESRI สามารถแสดงความคิดเห็นในเรื่องนี้ได้
James Mills

ฉันเจอปัญหาแรกและปัญหาที่สอง กับฉันการประสานงานดูเหมือนจะไม่เปลี่ยนแปลง (เมื่อคุณพิมพ์) แต่ geom1.equals (geom2) ทำให้ฉันล้มเหลวเพียงไม่กี่ครั้ง ฉันไม่แน่ใจว่าทำไมถึงเกิดขึ้นเช่นกัน ปัญหาที่สองได้รับการแก้ไขโดยใช้ข้อเสนอแนะของ @valveLondon หากคุณพบวิธีแก้ไข. equals โปรดแบ่งปัน
Michalis Avraam

@MichalisAvraam เรามีปัญหาเดียวกันและได้เข้าสู่ ESRI เพื่อแก้ปัญหา - กลายเป็นข้อผิดพลาดที่รู้จัก (เมื่อคุณสร้าง geom โดยไม่มีการฉายภาพมันตัดทอนความแม่นยำ) - ดูคำถามนี้ด้วย
om_henners

@om_henners ฉันคิดว่า แต่ฟังก์ชัน arcpy.AsShape () ไม่อนุญาตให้คุณระบุการอ้างอิงเชิงพื้นที่ ฉันได้ตั้งค่าตัวแปรสภาพแวดล้อมทั้งหมดหวังว่ามันจะทำอะไรบางอย่าง (เอาท์พุทคอร์ด ฯลฯ ... ) ทางออกคือการถอดรหัส GeoJSON ด้วยตนเองเพราะ ESRI ไม่สนใจเรื่องความถูกต้อง?
Michalis Avraam

คำตอบ:


5

ตกลง - ฉันคิดว่าฉันได้แก้ไขแล้ว

แทนที่ line ~ 80 ของไฟล์นี้ C: \ Python26 \ ArcGIS10.0 \ Lib \ arcpy \ arcobjects \ geometries.py จากนี้:

return {'type': 'Polygon', 'coordinates': [[(pt.X, pt.Y) for pt in part] for part in self]}

ถึงสิ่งนี้ (หรือบางสิ่งที่กระชับและหรูหรากว่าและทำสิ่งเดียวกัน):

  obj = {"type": "Polygon"}
    coordinates = []
    for part in self:
        _part = []
        for pt in part:
            if pt is not None:
                print pt
                _part.append([pt.X,pt.Y])
            else:
                print "none"
                coordinates.append(_part)
                _part=[]
        coordinates.append(_part)
    obj["coordinates"]=coordinates
    return obj

โดยทั่วไปพวกเขาลืมพิจารณาโดนัทในรูปร่างที่ถูกทำเครื่องหมายด้วยค่าจุดว่าง สิ่งนี้จะแยก geoJson ที่ดี (แยกส่วน) ออก แต่วิธี arcpy.AsShape ทำให้ GeoJSON ขัดข้อง

รหัสนี้:

import arcpy
gj = {
  'type': 'Polygon', 'coordinates': [
   [[-122.803764, 45.509158], [-122.796246, 45.500050], [-122.808193, 45.500109],
      [-122.803764, 45.509158]],
   [[-122.804206, 45.504509], [-122.802882, 45.502522], [-122.801866, 45.504479], 
      [-122.804206, 45.504509]]
   ]
 }

 p = arcpy.AsShape(gj)
 print p.__geo_interface__

ผลลัพธ์นี้:

    {'type': 'Polygon', 'coordinates': [[[-122.8037109375, 45.50927734375],  
    [-122.79620361328125, 45.5001220703125], [-122.80810546875, 45.5001220703125],
    [-122.8037109375, 45.50927734375]]]}

ฉันยอมแพ้. ;)

อัปเดต ปัญหาหลุมได้รับการแก้ไขที่ 10.1 ด้วย python อันนี้:

return {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None)
                                                    for pt in part]
                                                        for part in self]}

ไม่ควรส่งคืนพจนานุกรมแทนที่จะเป็นสตริงที่แทนพจนานุกรมหรือ :)
blah238

ใช่คุณพูดถูก ฉันเปลี่ยนมันเพื่อคาย GeoJSON dictionary obj ที่ถูกต้อง แต่หลังจากตรวจสอบกับวิธีการ AsShape ฉันตระหนักถึงความพยายามที่ไร้ประโยชน์ของฉัน
valveLondon

ฉันสงสัยว่ามีส่วนเกี่ยวข้องกับปัญหาที่อธิบายไว้ในหัวข้อนี้หรือไม่: forums.arcgis.com/threads/9763-Errors-in-arcpy-s-Polygon-class-ควรได้รับการแก้ไขใน 10 SP2 และ 10.1 แน่นอน
blah238

2
ESRI อัปเดตC:\Program Files\ArcGIS\Server\arcpy\arcpy\arcobjects\geometries.pyที่ 10.1 แต่ถ้าคุณอยู่ที่ 10.0 คุณสามารถแก้ไขได้ด้วยตัวเอง
valveLondon

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