Как создать круговой многоугольник в openlayers 3?


10

Поэтому я бы очень хотел изменить этот пример: http://openlayers.org/en/v3.0.0/examples/tissot.html?q=circle

Проблема в том, что когда я пытаюсь применить его к моей карте, он не работает, вероятно, потому что я использую стиль OSM, который не сферический:

var map = new ol.Map({
  layers: [
    new ol.layer.Tile({
        source: new ol.source.OSM()
      }),
    new ol.layer.Vector({
      source: vectorSource
    })
  ],
  renderer: 'canvas',
  target: 'map',
  view: new ol.View({
    center: ol.proj.transform([2.1833, 41.3833], 'EPSG:4326', 'EPSG:3857'),
    zoom: 2
  })
});

И на вопрос: как создать круговой многоугольник? Как я вижу, есть два варианта:

  1. Каким-то образом конвертировать geom.Circle в geom.Polygon, что я не могу сделать, основываясь на моем уровне noob

  2. Создайте мою собственную функцию для этого, что-то вроде openlayers 2:

    OpenLayers.Geometry.Polygon.createRegularPolygon = функция (начало координат, радиус, стороны, вращение) {
    var angle = Math.PI * ((1 / сторон) - (1/2)); if (вращение) {угол + = (вращение / 180) * Math.PI; } var rotatedAngle, x, y; var points = []; для (var i = 0; i

Кто-нибудь дошел до той же точки в своей жизни ГИС-мастера? Какой лучше? или есть скрытый путь, который могут видеть только Мудрые и Сильные? Помоги мне, пожалуйста!

Ответы:


13

Как правильно отметили другие, форматы GeoJSON и WKT никак не поддерживают круговую геометрию. Круги также не входят в спецификацию KML. Это вызывает боль при попытке записать фрейм карты в KML, GeoJSON или WKT.

В OpenLayers v3 есть способ аппроксимировать окружность многоугольником, но это не очень красиво, поскольку включает преобразование в большое расстояние круга. См. Ссылку API для этого ol.geom.Polygon.circularметода здесь: http://openlayers.org/en/v3.5.0/apidoc/ol.geom.Polygon.html#circular

Пример ol.geom.Polygon.circularметода показан ниже, но его также можно увидеть в этом примере индикатрисы тканей тканей OpenLayers .

 var lowpoly = ol.geom.Polygon.circular(
  /* WGS84 Sphere */
  new ol.Sphere(6378137),
  circle.getCenter(),
  circle.getRadius(),
  /* Number of verticies */
  12);

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

var lowpoly = ol.geom.Polygon.fromCircle(
  circle,
  /* Number of verticies (optional) */
  12,
  /* Start angle (optional) */
  90
);

Что-то, с чем вы можете играть, смотрите в моем jsFiddle здесь: https://jsfiddle.net/a1syw4od/9/


Я мог бы предложить редактирование, но, возможно, будет проще, если вы исправите это: в последнем примере следует использовать ol.geom.Polygon.fromCircle вместо ol.geom.Polygon.circular. Ура!
Арьян

0

Если вы заинтересованы в создании простого кругового многоугольника, используйте:

new ol.geom.Circle(
            ol.proj.transform([longitude, latitude], 'EPSG:4326', 'EPSG:3857'),
            radius_meters),
            'XY'
        )

Источник: http://openlayers.org/en/v3.0.0/apidoc/ol.geom.Circle.html (уберите стабильную галочку в верхней части страницы)


Это верно, но в настоящее время возникают проблемы, если вы собираетесь попробовать преобразовать функцию в GeoJSON. См. Github.com/openlayers/ol3/pull/3237#issuecomment-78475413
Даррен Рейд

также, когда вы пытаетесь извлечь геометрию в wkt, используя writeWKT.
Сурадж

1
ol.geom.Circleэто не многоугольник, это простая геометрия, представленная радиусом и центром. (см. базовый класс ol.geom.Circleis ol.geom.SimpleGeometrynot ol.geom.Polygon) GeoJSON, WKT и KML не имеют круговой геометрии в своей спецификации и требуют преобразования перед форматированием. Пожалуйста, смотрите мой ответ для способа приблизить ol.geom.Circleк истинному многоугольнику.
nagytech
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.