Turf js рисует идеальный квадрат с центром и радиусом

Я пытаюсь создать квадратный многоугольник p из центральной точки и радиуса. Как показано ниже.

bboxPolygon(square(bbox(circle(_circle.center, 0.5, { steps: 64 }))))

Все функции взяты из turf.js

Я считаю, что это должно генерировать идеальный квадрат или, по крайней мере, близкий к квадрату. Однако он возвращает прямоугольную форму.

Я не уверен, что это проблема библиотеки turf или я неправильно ее использую.

круг geojson

{
  "type": "Feature",
  "properties": {},
  "geometry": {
    "type": "Polygon",
    "coordinates": [
      [
        [
          -73.93524199999999,
          40.734656941636764
        ],
        [
          -73.93791238162646,
          40.73411472349626
        ],
        [
          -73.93986713367875,
          40.73263337851494
        ],
        [
          -73.94058248193825,
          40.730609876934174
        ],
        [
          -73.93986685239045,
          40.72858643688632
        ],
        [
          -73.93791210033818,
          40.72710521497083
        ],
        [
          -73.93524199999999,
          40.72656305836324
        ],
        [
          -73.93257189966181,
          40.72710521497083
        ],
        [
          -73.93061714760952,
          40.72858643688632
        ],
        [
          -73.92990151806174,
          40.730609876934174
        ],
        [
          -73.93061686632124,
          40.73263337851494
        ],
        [
          -73.93257161837353,
          40.73411472349626
        ],
        [
          -73.93524199999999,
          40.734656941636764
        ]
      ]
    ]
  }
}

bboxPolygon результат

{
  "type": "Feature",
  "bbox": [
    -73.93928894163675,
    40.72656305836324,
    -73.93119505836323,
    40.734656941636764
  ],
  "properties": {},
  "geometry": {
    "type": "Polygon",
    "coordinates": [
      [
        [
          -73.93928894163675,
          40.72656305836324
        ],
        [
          -73.93119505836323,
          40.72656305836324
        ],
        [
          -73.93119505836323,
          40.734656941636764
        ],
        [
          -73.93928894163675,
          40.734656941636764
        ],
        [
          -73.93928894163675,
          40.72656305836324
        ]
      ]
    ]
  }
}

person fiddlest    schedule 12.03.2020    source источник


Ответы (2)


Думаю, проблема в функции turf.square. Это не то, что я ожидал.

У вас должно получиться что-то очень близкое к квадрату, если вы замените bboxPolygon(square(bbox(circle(_circle.center, 0.5, { steps: 64 }))))

с участием

bboxPolygon(bbox(circle(_circle.center, 0.5, { steps: 64 })))

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

введите здесь описание изображения

Если вы посмотрите исходный код square вы заметите, что на самом деле он не создает bbox с одинаковыми расстояниями с каждой стороны. Однако он создает bbox с одинаковым изменением степени. Поскольку мы работаем по долготе и широте, это обычно НЕ будет квадратным по расстоянию многоугольником.

Я не уверен, зачем кому-то когда-либо понадобилась эта square функция, поскольку я бы нашел ее более полезной, если бы она была квадратной по расстоянию, однако я не знаю, является ли это предполагаемым поведением.

TL; DR. Попробуйте вместо этого bboxPolygon(bbox(circle(_circle.center, 0.5, { steps: 64 })))

person the_cheff    schedule 12.03.2020

Приведенный выше ответ @the_cheff крайне неэффективен, потому что он выполняет итерацию по 64 точкам для вычисления прямоугольника. Альтернативным решением может быть реализация, аналогичная тому, как Turf реализует круглая трава:

const square = (center: [number, number], radius: number): GeoJSON.Feature<GeoJSON.Geometry> => {
   const cross = Math.sqrt(2 * radius ** 2);
   const coordinates = [];
   
   for (let i = 0; i < 4; i++) {
    coordinates.push(destination(center, cross, i * -360 / 4 + 45, {}).geometry.coordinates);
   }
   coordinates.push(coordinates[0]);

   return polygon([coordinates], {});
}

Надеюсь, это поможет кому-нибудь в будущем.

person Niels    schedule 23.07.2020