arcpy.geometry __geo_interface__ та AsShape () функція: втрата точності та дірки


10

Я серіалізую свої геометрії аркпію як геойсон, щоб потім я міг їх «гідратати» як геометрії, і у мене виникли 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: Отвори Якщо у багатокутнику є отвори, геоінтерфейс генерує помилку:

    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 сам. І, здається, не дуже люблю цю тему.
клапан Лондон

У ArcGIS 10.1 це все ще зламано. - Було б добре, якби ESRI міг прокоментувати цю тему.
Джеймс Міллз

Я натрапив на першу та другу проблеми. У мене, здається, узгоджена ситуація не змінюється (коли ви їх друкуєте), але geom1.equals (geom2) не вдається мені лише кілька разів. Я не впевнений, чому так трапляється. Друга проблема була виправлена ​​за допомогою пропозиції @valveLondon. Якщо ви дізналися, як виправити .equals, будь ласка, поділіться.
Міхаліс Авраам

@MichalisAvraam У нас була та сама проблема, і ми потрапили на ESRI для вирішення - виявляється, це відома помилка (коли ти створюєш гема без проекції, він уселяє точність) - також поглянь на це питання .
om_henners

@om_henners Я припустив, що. Але функція arcpy.AsShape () не дозволяє вказати просторову посилання. Я встановив усі змінні середовища, сподіваючись, що це щось зробить (вихідні координати тощо). Тоді рішення полягає в ручному декодуванні GeoJSON, оскільки ESRI не піклується про точність?
Міхаліс Авраам

Відповіді:


5

Гаразд - добре, я думав, що вирішив.

замініть рядок ~ 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 (окремі частини), але дуга. Метод 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 obj. але перевіривши метод AsShape, я зрозумів марність своїх зусиль.
клапан Лондон

Цікаво, чи це пов’язане з проблемою, описаною в цій темі: 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, ви можете виправити це самостійно.
клапан Лондон

3
Так, я виправив це в 10.1, вище оновлення - це нове джерело у .pyфайлі. Я подумав, що це зробило це у пакет оновлень на 10, але, мабуть, ні.
Jason Scheirer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.