¿Cómo crear un polígono circular en openlayers 3?

10

Así que realmente me gustaría modificar este ejemplo: http://openlayers.org/en/v3.0.0/examples/tissot.html?q=circle

El problema es que cuando trato de aplicarlo a mi mapa no funciona, probablemente porque uso el estilo OSM que no es esférico:

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
  })
});

Y para la pregunta: ¿cómo crear un polígono circular? Como puedo ver, hay dos opciones:

  1. De alguna manera convertir geom.Circle en geom.Polygon, que no puedo hacer, según mi nivel de novato

  2. Crear mi propia función para hacer eso, algo así como Openlayers 2:

    OpenLayers.Geometry.Polygon.createRegularPolygon = function (origen, radio, lados, rotación) {
    var angle = Math.PI * ((1 / sides) - (1/2)); if (rotación) {ángulo + = (rotación / 180) * Math.PI; } var rotatedAngle, x, y; puntos var = []; para (var i = 0; i

¿Alguien ha llegado al mismo punto en su vida maestra de SIG? ¿Cuál es mejor? ¿O hay un camino oculto que solo los sabios y fuertes pueden ver? ¡Ayudame por favor!

usuario1929437
fuente

Respuestas:

13

Como otros han señalado correctamente, los formatos GeoJSON y WKT no admiten geometrías circulares de ninguna manera. Los círculos tampoco están en la especificación KML. Esto hace que sea difícil cuando se trata de escribir un marco de mapa en KML, GeoJSON o WKT.

OpenLayers v3 tiene una forma de aproximar un círculo con un polígono, pero no es bonito, ya que implica la conversión a una gran distancia del círculo. Consulte la referencia de API para el ol.geom.Polygon.circularmétodo aquí: http://openlayers.org/en/v3.5.0/apidoc/ol.geom.Polygon.html#circular

A continuación se muestra un ejemplo del ol.geom.Polygon.circularmétodo, pero también se puede ver en este ejemplo de matriz de tejido de OpenLayers .

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

Alternativamente, puede usar el fromCircleque, en el momento de esta publicación, es experimental.

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

Para algo con lo que puedes jugar, mira mi jsFiddle aquí: https://jsfiddle.net/a1syw4od/9/

nagytech
fuente
Podría proponer una edición, pero tal vez sea más fácil si la arreglas: el último ejemplo debería usar en ol.geom.Polygon.fromCircle lugar de ol.geom.Polygon.circular. ¡Salud!
Arjan
0

Si está interesado en crear un polígono circular simple, use:

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

Fuente: http://openlayers.org/en/v3.0.0/apidoc/ol.geom.Circle.html (elimine la marca estable en la parte superior de la página)

Mubaryus
fuente
Esto es válido, pero actualmente tiene problemas si tiene la intención de intentar convertir la función en GeoJSON. Ver github.com/openlayers/ol3/pull/3237#issuecomment-78475413
Darren Reid,
también cuando intentas extraer geometría en wkt usando writeWKT.
Suraj
1
ol.geom.CircleNo es un polígono, es una geometría simple representada por un radio y un centro. (vea que la clase base de no ol.geom.Circlees ) GeoJSON, WKT y KML no tienen geometrías circulares en sus especificaciones y requieren conversión antes de formatear. Por favor, vea mi respuesta para una forma de aproximar un por un polígono verdadero. ol.geom.SimpleGeometryol.geom.Polygonol.geom.Circle
nagytech