Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2012-10-09

Колбасой вниз

Неправильно ты, дядя Федор, бутерброд ешь

Продолжая вчерашнюю тему, про скрипт геопроцессинга в 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"}
}]}

Сцылки

2 комментария:

  1. [offtop]
    читаю, стыдно становится.
    никак себя ковыряться в своих амбарах и сусеках заставить не могу.
    Столько можно (и нужно) хорошего сделать, а не двигаюсь. От жеж.
    [/offtop]

    ОтветитьУдалить
    Ответы
    1. сложный ассоциативный ряд, не понял.
      У меня с такими шарадами, что АркГИС загадывает, вообще времени ни на что не остается :)

      Удалить

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) Klaipeda (13) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)