Hàm arcpy.geometry __geo_interface__ và AsShape (): mất độ chính xác và lỗ hổng


10

Tôi sắp xếp thứ tự hình học phức tạp của mình dưới dạng Geojson để tôi có thể 'hydrat hóa' chúng trở lại như hình học sau này và tôi đang gặp 2 vấn đề trong chu trình.:

VẤN ĐỀ 1: Chính xác

    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

Nếu tôi kiểm tra biểu diễn chuỗi, tọa độ đã thay đổi một chút:

    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)]]}

VẤN ĐỀ 2: Lỗ Nếu đa giác có lỗ, Geo_interface tạo ra lỗi:

    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'

Bất kỳ ý tưởng về cách giải quyết những vấn đề này?


Đúng, chỉ cần chạy qua số 2 bản thân mình. Và dường như không có nhiều tình yêu cho chủ đề này.
vanLondon

Điều này vẫn bị phá vỡ trong arcpy trong ArcGIS 10.1 - Thật tuyệt nếu ESRI có thể nhận xét về chủ đề này.
James Mills

Tôi đã đi qua các vấn đề đầu tiên và thứ hai. Với tôi, phối hợp dường như không thay đổi (khi bạn in chúng) nhưng geom1.equals (geom2) chỉ làm tôi thất bại một vài lần. Tôi không chắc tại sao điều đó cũng xảy ra. Vấn đề thứ 2 đã được khắc phục bằng đề xuất của @valveLondon. Nếu bạn tìm ra cách sửa .equals, hãy chia sẻ.
Michalis Avraam

@MichalisAvraam Chúng tôi cũng gặp vấn đề tương tự và đã tìm đến ESRI để tìm giải pháp - hóa ra đó là một lỗi đã biết (khi bạn tạo một geom mà không cần chiếu, nó cũng cắt bỏ độ chính xác) - hãy xem câu hỏi này .
om_henners

@om_henners Tôi giả sử rằng. Nhưng hàm arcpy.AsShape () không cho phép bạn chỉ định tham chiếu không gian. Tôi đã đặt tất cả các biến môi trường với hy vọng nó sẽ làm được điều gì đó (coords đầu ra, v.v ...). Giải pháp sau đó là giải mã thủ công GeoJSON vì ESRI không quan tâm đến độ chính xác?
Michalis Avraam

Câu trả lời:


5

OK - tôi nghĩ rằng tôi đã giải quyết nó.

thay thế dòng ~ 80 của tệp này C: \ Python26 \ ArcGIS10.0 \ Lib \ arcpy \ arcobjects \ geometries.py từ đây:

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

với điều này (hoặc một cái gì đó ngắn gọn và thanh lịch hơn và làm điều tương tự):

  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

Về cơ bản, họ quên xem xét bánh rán trong hình được đánh dấu bằng các giá trị điểm null. Điều này tạo ra GeoJson tốt (các phần riêng biệt) nhưng phương thức arcpy.AsShape bỏ qua GeoJSON.

mã này:

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__

đầu ra này:

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

Tôi từ bỏ. ;)

Cập nhật Vấn đề lỗ hổng đã được giải quyết ở 10.1 với đoạn python này:

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

không nên trả lại một từ điển thay vì một chuỗi đại diện cho một từ điển? :)
blah238

Vâng, bạn đúng, nó nên. Tôi đã thay đổi nó để nhổ một obj từ điển GeoJSON hợp lệ. nhưng sau khi kiểm tra phương pháp AsShape tôi nhận ra sự vô ích của những nỗ lực của mình.
vanLondon

Tôi tự hỏi liệu điều đó có liên quan gì đến vấn đề được mô tả trong chủ đề này không: forum.arcgis.com/threads/9763-Errors-in-arcpy-s-Polygon- class - nên đã được sửa trong 10 SP2 và chắc chắn 10.1.
blah238

2
ESRI cập nhật C:\Program Files\ArcGIS\Server\arcpy\arcpy\arcobjects\geometries.pyở mức 10.1 nhưng nếu bạn ở mức 10.0, bạn có thể tự sửa nó.
vanLondon

3
Có, tôi đã sửa nó trong 10.1, bản cập nhật ở trên là nguồn mới trong .pytệp. Tôi nghĩ rằng nó đã biến nó thành một gói dịch vụ cho 10 nhưng tôi đoán là không.
Jason Scheirer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.