Como criar polígono circular em openlayers 3?

9

Então, eu realmente gostaria de modificar este exemplo: http://openlayers.org/en/v3.0.0/examples/tissot.html?q=circle

O problema é que, quando tento aplicá-lo ao meu mapa, ele não funciona, provavelmente porque uso o estilo OSM, que não é 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
  })
});

E para a pergunta: como criar polígono circular? Como posso ver, existem duas opções:

  1. De alguma forma, converter geom.Circle em geom.Polygon, o que não posso fazer, com base no meu nível de noob

  2. Crie minha própria função para fazer isso, algo como openlayers 2:

    OpenLayers.Geometry.Polygon.createRegularPolygon = function (origem, raio, lados, rotação) {
    var angle = Math.PI * ((1 / sides) - (1/2)); if (rotação) {ângulo + = (rotação / 180) * Math.PI; } var rotatedAngle, x, y; pontos var = []; para (var i = 0; i

Alguém chegou ao mesmo ponto em sua vida de mestre em SIG? Qual é o melhor? ou existe um caminho oculto, que somente os Sábios e os Fortes podem ver? Ajude-me, por favor!

user1929437
fonte

Respostas:

11

Como outros salientaram corretamente, os formatos GeoJSON e WKT não suportam geometrias circulares de forma alguma. Os círculos também não estão na especificação KML. Isso torna difícil ao gravar um quadro de mapa no KML, GeoJSON ou WKT.

O OpenLayers v3 tem uma maneira de aproximar um círculo com um polígono, mas não é bonito, pois envolve a conversão para uma grande distância do círculo. Consulte a referência da API para o ol.geom.Polygon.circularmétodo aqui: http://openlayers.org/en/v3.5.0/apidoc/ol.geom.Polygon.html#circular

Um exemplo do ol.geom.Polygon.circularmétodo é mostrado abaixo, mas também pode ser visto neste exemplo de indicatriz de tecidos OpenLayers .

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

Como alternativa, você pode usar o fromCircleque, no momento desta postagem, é experimental.

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

Para algo com o qual você possa brincar, consulte meu jsFiddle aqui: https://jsfiddle.net/a1syw4od/9/

nagytech
fonte
Eu poderia propor uma edição, mas talvez seja mais fácil se você a corrigir: o último exemplo deve ser usado em ol.geom.Polygon.fromCircle vez de ol.geom.Polygon.circular. Felicidades!
Arjan
0

Se você estiver interessado em criar um polígono circular simples, use:

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

Fonte: http://openlayers.org/en/v3.0.0/apidoc/ol.geom.Circle.html (remova a marca estável na parte superior da página)

Mubaryus
fonte
Isso é válido, mas atualmente tem problemas se você pretende tentar converter o recurso em GeoJSON. Veja github.com/openlayers/ol3/pull/3237#issuecomment-78475413
Darren Reid
também quando você tenta extrair geometria no wkt usando writeWKT.
Suraj
11
ol.geom.Circlenão é um polígono, é uma geometria simples representada por um raio e um centro. (veja a classe base de ol.geom.Circleis ol.geom.SimpleGeometrynot ol.geom.Polygon) GeoJSON, WKT e KML não possuem geometrias circulares em suas especificações e requerem conversão antes da formatação. Por favor, veja minha resposta para uma maneira de aproximar um ol.geom.Circlepor um polígono verdadeiro.
Nagytech 22/05