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

이것은 ArcGIS 10.1에서 여전히 삐걱 거리고 있습니다. ESRI가 주제에 대해 언급 할 수 있다면 좋을 것입니다.
James Mills

나는 첫번째와 두번째 문제를 만났다. 나와 함께 좌표가 변경되지 않는 것처럼 보이지만 (인쇄 할 때) geom1.equals (geom2)는 몇 번만 실패합니다. 왜 그런지 잘 모르겠습니다. 두 번째 문제는 @valveLondon의 제안을 사용하여 수정되었습니다. .equals 수정 방법을 발견 한 경우 공유하십시오.
Michalis Avraam

@MichalisAvraam 우리도 같은 문제를 겪고 해결책을 위해 ESRI에 도달했습니다. 알려진 버그 인 것으로 나타났습니다 (투영없이 지오메트리를 만들 때 정밀도가 잘립니다)- 이 질문 도 살펴보십시오 .
om_henners 2009

@om_henners 나는 그것을 가정했습니다. 그러나 arcpy.AsShape () 함수를 사용하면 공간 참조를 지정할 수 없습니다. 나는 무언가를하기를 희망하는 모든 환경 변수를 설정했습니다 (출력 좌표 등). 해결책은 ESRI가 정확성에 신경 쓰지 않기 때문에 GeoJSON을 수동으로 디코딩하는 것입니까?
Michalis Avraam

답변:


5

알았어. 잘 풀 었다고 생각 했어.

이 파일 C : \ Python26 \ ArcGIS10.0 \ Lib \ arcpy \ arcobjects \ geometries.py의 ~ 80 행을 다음과 같이 바꾸십시오.

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 에서이 파이썬 덩어리로 해결되었습니다.

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

사전을 나타내는 문자열 대신 사전을 반환해서는 안됩니까? :)
blah238

예, 그렇습니다. 유효한 GeoJSON 사전 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이면 직접 해결할 수 있습니다.
Valve 런던

3
예, 10.1에서 수정했습니다. 위의 업데이트는 .py파일 의 새로운 소스입니다 . 나는 그것이 10의 서비스 팩으로 만들었다 고 생각했지만 그렇지 않습니다.
Jason Scheirer 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.