По ходу реализации
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
Спецификации
Комментариев нет:
Отправить комментарий