Вычисление центра тяжести многоугольника geoJSON с помощью jq - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть список городов, описанных их многоугольником в файлах geoJSON.

Я хотел бы получить образец внутри точки многоугольника.

Базовая математика говорит, что центр тяжестивнутри многоугольника и достаточно сложить все долготы и все широты вместе, а затем разделить его на количество точек.

Полный файл для обработки (визуализация доступна на GitHub)

{
  "type": "FeatureCollection",
  "features": [
  {
    "type": "Feature",
    "geometry": {
      "type": "Polygon",
      "coordinates": [[[2.41101, 48.72605], [2.41554, 48.72656], [2.41718, 48.72791], [2.4211, 48.72953], [2.42603, 48.72824], [2.42756, 48.72865], [2.42922, 48.72723], [2.43133, 48.72646], [2.43404, 48.72665], [2.43513, 48.72409], [2.42554, 48.7227], [2.42072, 48.72105], [2.41426, 48.71782], [2.41327, 48.71869], [2.41582, 48.72086], [2.41238, 48.72193], [2.41136, 48.72325], [2.41101, 48.72605]]]
    },
    "properties": {
      "code": "94001",
      "nom": "Ablon-sur-Seine"
    }
  },
  {
    "type": "Feature",
    "geometry": {
      "type": "Polygon",
      "coordinates": [[[2.41959, 48.81691], [2.4159, 48.81633], [2.40936, 48.81667], [2.40787, 48.81746
    },
    "properties": {
      "code": "94018",
      "nom": "Charenton-le-Pont"
    }
  },
  ...
  ]
}

У меня уже есть команда, которая вычисляет длину вершин многоугольника.

$ curl -s https://raw.githubusercontent.com/gregoiredavid/france-geojson/master/departements/94-val-de-marne/communes-94-val-de-marne.geojson \
> | jq '.features[0].geometry.coordinates[0][][0]' \
> | jq -s 'add/length'
2.4206944444444445

См. https://unix.stackexchange.com/questions/13731/

Используя jq и простые команды bash, как я могувычислить сумму долгот и сумму широт, а также повторно ввести барицентр в поле properties в другом файле geoJSON?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Так что, если я правильно понял, вы пытаетесь получить средние значения первого набора координат, а затем обновляете свойства для сохранения результата.

.features[] |= (
    (.geometry.coordinates[0] | length as $len | reduce .[] as [$x, $y] ([0,0];
        [.[0] + $x, .[1] + $y]
    ) | map(. / $len)) as $barrycenter |
    .properties.barycenter = $barrycenter
)
0 голосов
/ 23 сентября 2018

Предупреждение

"Центр тяжести" многоугольника, как правило, не совпадает с точкой, определенной в терминах средних значений координат x и y его вершин.См., Например, https://math.stackexchange.com/questions/3177/why-doesnt-a-simple-mean-give-the-position-of-a-centroid-in-a-polygon

Средние значения широт и долгот

Вот фильтр jq, который с помощью одного вызова jq и без избыточности вычислит средние значения широти из долготы каждой "особенности":

.features[].geometry.coordinates[0]
| [ [.[][0]], [.[][1]] ]
| map(add/length)

С параметром командной строки -c это производит поток массивов, один массив для каждой "особенности".Поток начинается:

[2.4206944444444445,48.724651111111115]
[2.407614,48.82250133333333]
...

Конечно, есть и другие альтернативы, но учтите, что нет необходимости использовать интерполяцию строк для выполнения группировки, поэтому обычно нет необходимости в tr, как это делала ваша первая версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...