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

2013-07-29

attributes = collections.OrderedDict()

Сейчас я вам открою тайну: в ArcGis Viewer for Silverlight есть глупая бага. При выводе табличных данных в grid нельзя допускать пустых значений в первой колонке.

Сколько я времени убил на эту багу — ужас. В эталонном примере окно фильтра данных работает — показывает атрибутивные данные слоя, а для слоя из Mapfeatureserver окно фильтра крутит песочные часы вместо вывода таблички. Чего я только не перепробовал, какие только гипотезы не проверял, все бестолку. А оказалось — примитив, если в первой колонке данных попадаются значения «null», то табличка не выводится. В эталонных примерах первой колонкой всегда идет OBJECTID, который по определению не может быть пустым. Поэтому проблема вывода атрибутики в табличку никогда не проявляется.
Вот так выглядит нормальное окно, grid заполнен данными.

В Mapfeatureserver я использую словари Python из которых генерируется текст JSON. Использование словарей означает произвольный порядок вывода ключей, если не применять сортировку. Казалось бы, порядок следования ключей в словаре не имеет значения. Во всяком случае, в спецификации это никак не оговорено. Ан нет. значение есть и весомое.

Короче, от сортировки ключей пришлось отказаться, а для обьекта attributes я теперь использую collections.OrderedDict. Это позволяет выводить ключи в JSON в том порядке, в каком они добавлялись в словарь. Что позволяет управлять очередностью полей в выдаче путем формирования запроса SQL, где поля перечислены в нужном порядке.

Пример:
        attributes = collections.OrderedDict()
        geometry = {}
        for colnum, col in columns(cur.description):
            fldname = unicode(col.name).lower()
            if fldname == u'shape':  # geometry
                shape = simplejson.loads(rec[colnum])
                geometryType, geometry = esri.geoJson2agJson(shape)
                continue

            if fldname == lyrinfo.geomfield:
                continue
            if fldname not in lyrinfo.fields:  # unknown field
                ufields[fldname] = ''
                continue

            attributes[lyrinfo.fields[fldname]['name']] = rec[colnum]


Неправильно:
"features": [
    {
      "attributes": {
        "descr": null,
        "gid": 1,
        "ptchlenght": 3,
        "pthcdeptht": 5,
        "regdaterec": "2012.07.23",
        "regdaterep": null,
        "roadcarpet": "Асфальт",
        "testtimestamp": null
      },
      "geometry": {
        "x": 36.49966537,
        "y": 52.88048986900003
      }
    },

Правильно:
"features": [
    {
      "attributes": {
        "gid": 1,
        "descr": null,
        "ptchlenght": 3,
        "pthcdeptht": 5,
        "regdaterec": "2012.07.23",
        "regdaterep": null,
        "roadcarpet": "Асфальт",
        "testtimestamp": null
      },
      "geometry": {
        "x": 36.49966537,
        "y": 52.88048986900003
      }
    },


original post http://vasnake.blogspot.com/2013/07/attributes-collectionsordereddict.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

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) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) 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) Baltic (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) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)