Я сериализую свои дугообразные геометрии как 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'
Есть идеи, как решить эти проблемы?
arcpy
geojson
attributeerror
Виктор Веларде
источник
источник
Ответы:
Хорошо - я думал, что решил это.
замените строку ~ 80 этого файла C: \ Python26 \ ArcGIS10.0 \ Lib \ arcpy \ arcobjects \ geometryries.py из этого:
на это (или что-то более краткое и элегантное и делает то же самое):
В основном они забыли рассмотреть пончики в форме, которые отмечены нулевыми значениями. Это выдает хороший geoJson (отдельные части), но метод arcpy.AsShape уничтожает GeoJSON.
этот код:
выводит это:
Я сдаюсь. ;)
Обновление Проблема с дырами была решена в 10.1 с помощью этого фрагмента python:
источник
C:\Program Files\ArcGIS\Server\arcpy\arcpy\arcobjects\geometries.py
до 10.1, но если вы на 10.0, вы можете исправить это самостоятельно..py
файле. Я думал, что это превратилось в пакет обновления для 10, но я думаю, что нет.