Як створити круговий багатокутник у відкритих шарах 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методу показаний нижче, але його також можна побачити в цьому прикладі індикатрису tissot 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
Darren Reid

також коли ви намагаєтеся витягти геометрію у wkt, використовуючи writeWKT.
Сурай

1
ol.geom.Circleне є багатокутником, це проста геометрія, представлена ​​радіусом і центром. (див. базовий клас не ol.geom.Circleє ) GeoJSON, WKT та KML не мають кругової геометрії у своїх специфікаціях і потребують перетворення перед форматуванням. Будь ласка, дивіться мою відповідь щодо способу наближення справжнього багатокутника. ol.geom.SimpleGeometryol.geom.Polygonol.geom.Circle
nagytech
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.