Неправильно
ты, дядя Федор, бутерброд ешь
Продолжая
вчерашнюю
тему, про скрипт геопроцессинга
в ArcGIS.
Один из
параметров, передаваемых в скрипт,
должен быть полигоном.
Казалось бы, чего там, замкнутая
последовательность координат. Для
проверки, чего там в скрипт пришло, пишу
примитивную распечатку
import arcpy fsetObj = arcpy.GetParameter(0) log.info("arcpyStuff, input polygons obj '%s'" % (fsetObj)) # geoprocessing record set object (FeatureSet) rows = arcpy.SearchCursor(fsetObj) for row in rows: geom = row.shape log.info("arcpyStuff searchcursor, geometry type '%s', area '%s', parts '%s'" % (geom.type, geom.area, geom.partCount)) log.info("arcpyStuff searchcursor, geometry geojson '%s'" % (geom.__geo_interface__)) for part in geom: for pnt in part: log.info("arcpyStuff searchcursor, point x '%s', y '%s'" % (pnt.X, pnt.Y)) |
Тестирую. В
одном случае получаю вполне приличный
выхлоп
arcpyStuff, input polygons obj '<geoprocessing record set object object at 0x0B88D320>' arcpyStuff searchcursor, geometry type 'polygon', area '162541855691.0', parts '1' arcpyStuff searchcursor, geometry geojson '{'type': 'Polygon', 'coordinates': [[(7631473.2368000001, 9783939.6089000031), (7807584.1499999985, 10370975.986100003), (8238077.4932999983, 9960050.5221000016), (7631473.2368000001, 9783939.6089000031)]]}' arcpyStuff searchcursor, point x '7631473.2368', y '9783939.6089' arcpyStuff searchcursor, point x '7807584.15', y '10370975.9861' arcpyStuff searchcursor, point x '8238077.4933', y '9960050.5221' arcpyStuff searchcursor, point x '7631473.2368', y '9783939.6089' |
А в другом
случае фигня какая-то
arcpyStuff, input polygons obj '<geoprocessing record set object object at 0x0B88D1A0>' arcpyStuff searchcursor, geometry type 'polygon', area '-124443116821.0', parts '0' arcpyStuff searchcursor, geometry geojson '{'type': 'Polygon', 'coordinates': []}' |
При этом на
вход я засылаю практически идентичные
треугольники. Как такое может быть,
чтобы у полигона не было координат и
при этом была отрицательная площадь?
Да очень просто.
Фишка называется «внутреннее кольцо»
(interior ring) или дырка от бублика. Достаточно
при отрисовке полигона рисовать его
против часовой стрелки, чтобы ArcGIS
воспринял его как дырку от бублика.
Беда в том, что
ситуация «дырка от бублика» имеет смысл
если полигон состоит из минимум двух
колец (ring) — внешнего и внутреннего. А
если кольцо только одно, как в моем
случае (треугольник нарисован против
часовой стрелки), то про дырки можно
забыть, нету их по определению. Но ArcGIS
не может похвастаться интеллектом.
Нарисовал против часовой стрелки —
значит дырка и ниипет.
А отягощается
это логикой разделения колец в полигоне.
Координаты дырки отделяются от внешнего
кольца нуллом (null). Что будет если внешнего
кольца нет? Один нулл и ничего больше.
Как результат — я не могу получить
присланные координаты. Фак. Зато площадь
отрицательную могу получить.
Так и живем —
отправить координаты можно а получить
их нельзя. При этом ни один валидатор
ArcGIS и не думает ругацца. А что? Дырка от
бублика это нормально. И это не единственная
проблема, см.сцылки в хвосте. Про то,
куда девается определение системы
координат (spatial reference) поговорим в другой
раз.
Остается только
одно, ужесточить требования к входным
параметрам и требовать на вход уже
валидный полигон, обьясняя это тем, что
добрые люди не позволяют выполнить
валидацию и исправление геометрии на
сервере. Пусть пользователь рисует
аккуратно, по часовой стрелке.
Приложение
Правильный
полигон
inputPolygon={ "geometryType":"esriGeometryPolygon", "spatialReference":{"wkid":102100}, "features":[{ "geometry":{ "spatialReference":{"wkid":102100}, "rings":[[[7592337.47835702,9803507.48815798],[7924991.42545401,10312272.348424],[8277213.25179201,9979618.40132698],[7592337.47835702,9803507.48815798]]] }, "attributes":{} }]} |
Неправильный
полигон — дырка от бублика
inputPolygon={ "geometryType" : "esriGeometryPolygon", "spatialReference" : {"wkid" : 4326}, "fields": [ { "name": "Name", "type": "esriFieldTypeString", "alias": "Name" } ], "features" : [{ "geometry" : { "rings" : [[ [-97.06326,32.759], [-97.06298,32.755], [-97.06153,32.749], [-97.06326,32.759] ]], "spatialReference" : {"wkid" : 4326} }, "attributes" : {"Name" : "Feature 1"} }]} |
Сцылки
http://gisintelligence.wordpress.com/2011/06/30/repair-geometry-is-critical/
original post http://vasnake.blogspot.com/2012/10/blog-post_9.html
original post http://vasnake.blogspot.com/2012/10/blog-post_9.html
[offtop]
ОтветитьУдалитьчитаю, стыдно становится.
никак себя ковыряться в своих амбарах и сусеках заставить не могу.
Столько можно (и нужно) хорошего сделать, а не двигаюсь. От жеж.
[/offtop]
сложный ассоциативный ряд, не понял.
УдалитьУ меня с такими шарадами, что АркГИС загадывает, вообще времени ни на что не остается :)