По ходу реализации
Mapfeatureserver
встречаются занятные проблемы. В
частности, результаты надо выдавать в
JSON, а именно гео-JSON
версии Esri. Из PostGIS я
забираю честный GeoJSON а
клиенту отдаю EsriJSON, который,
по непонятным причинам отличается от
GeoJSON чисто косметически.
Для точек и полилиний преобразование
тривиальное, а вот с полигонами пришлось
повозиться.
if geometryType == u'esriGeometryPoint': geometry = {"x": shape['coordinates'][0], "y": shape['coordinates'][1]} elif geometryType == u'esriGeometryPolyline': geometry = {"paths": shape['coordinates']} elif geometryType == u'esriGeometryPolygon': if len(shape['coordinates']) == 1: geometry = {"rings": shape['coordinates'][0]} else: geometry = {"rings": shape['coordinates']} rings = [] for ring in shape['coordinates']: for e in ring: rings.append(e) geometry = {"rings": rings} else: raise ValueError("geoJson2agJson: unknown geometry type '%s'" % geometryType) |
Причем основная возня
была на этапе проверок. Заодно выяснилось,
что при копировании данных по схеме
Esri FileGDB → shp → PostGIS полигоны
оказываются перекрученными. В смысле
первая, она же последняя точка оказывается
в другом месте полигона, да и направление
обхода точек может поменяться.
Пример данных для
полигонов
GeoJSON выдает
что-то типа
{u'type': u'MultiPolygon', u'coordinates': [ [[ [4279602.386113361, 7520773.048816763], [4279572.070031156, 7520668.786903687], [4279455.184565822, 7520710.387695587], [4279602.386113361, 7520773.048816763] ]], [[ [4208589.216875655, 7569584.6493480615], [4208579.177972653, 7569396.323268423], [4207803.281121826, 7568963.732610181], [4208589.216875655, 7569584.6493480615] ]], [[ [4226201.053365226, 7697045.899310788], [4226164.317933269, 7697577.007928321], ... [4211359.938852671, 7621739.802166396], [4226201.053365226, 7697045.899310788] ]] ]} |
а
EsriJSON должен быть наподобие
такого
«rings»: [ [ [4279602.386113361, 7520773.048816763], [4279572.070031156, 7520668.786903687], [4279455.184565822, 7520710.387695587], [4279602.386113361, 7520773.048816763] ], [ [4208589.216875655, 7569584.6493480615], [4208579.177972653, 7569396.323268423], [4207803.281121826, 7568963.732610181], [4208589.216875655, 7569584.6493480615] ], [ [4226201.053365226, 7697045.899310788], [4226164.317933269, 7697577.007928321], ... [4211359.938852671, 7621739.802166396], [4226201.053365226, 7697045.899310788] ]] |
Что любопытно, после
того как я написал решение на Python, нашлось
решение на JavaScript
Спецификации
Комментариев нет:
Отправить комментарий