Come creare un poligono circolare in openlayers 3?


10

Quindi vorrei davvero modificare questo esempio: http://openlayers.org/en/v3.0.0/examples/tissot.html?q=circle

Il problema è che quando provo ad applicarlo alla mia mappa non funziona, probabilmente perché uso uno stile OSM che non è sferico:

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 per la domanda: come creare un poligono circolare? Come posso vedere, ci sono due scelte:

  1. In qualche modo converti geom.Circle in geom.Polygon, cosa che non posso fare, in base al mio livello di noob

  2. Crea la mia funzione per farlo, qualcosa come openlayers 2:

    OpenLayers.Geometry.Polygon.createRegularPolygon = funzione (origine, raggio, lati, rotazione) {
    var angle = Math.PI * ((1 / lati) - (1/2)); if (rotazione) {angolo + = (rotazione / 180) * Math.PI; } var rotatedAngle, x, y; var points = []; per (var i = 0; i

Qualcuno è arrivato allo stesso punto nella loro vita da maestro GIS? Qual è il migliore? o c'è un sentiero nascosto, che solo i saggi e i forti possono vedere? Aiutami per favore!

Risposte:


13

Come altri hanno correttamente sottolineato, i formati GeoJSON e WKT non supportano in alcun modo le geometrie circolari. I cerchi non sono nemmeno nella specifica KML. Questo è un problema quando si tenta di scrivere un frame della mappa su KML, GeoJSON o WKT.

OpenLayers v3 ha un modo per approssimare un cerchio con un poligono, ma non è carino in quanto comporta la conversione in una grande distanza del cerchio. Vedi il riferimento API per il ol.geom.Polygon.circularmetodo qui: http://openlayers.org/en/v3.5.0/apidoc/ol.geom.Polygon.html#circular

Un esempio del ol.geom.Polygon.circularmetodo è mostrato sotto, ma può anche essere visto in questo esempio indicatrix tissot di OpenLayers .

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

In alternativa, puoi usare ciò fromCircleche, al momento di questo post, è sperimentale.

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

Per qualcosa con cui puoi giocare, guarda il mio jsFiddle qui: https://jsfiddle.net/a1syw4od/9/


Potrei proporre una modifica, ma forse è più facile se la risolvi: l'ultimo esempio dovrebbe usare ol.geom.Polygon.fromCircle piuttosto che ol.geom.Polygon.circular. Saluti!
Arjan,

0

Se sei interessato a creare un semplice poligono circolare, utilizza:

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 (rimuovi il segno di spunta stabile nella parte superiore della pagina)


Questo è valido, ma attualmente ha problemi se si intende provare a convertire la funzione in GeoJSON. Vedi github.com/openlayers/ol3/pull/3237#issuecomment-78475413
Darren Reid

anche quando si tenta di estrarre la geometria in wkt usando writeWKT.
Suraj,

1
ol.geom.Circlenon è un poligono, è una semplice geometria rappresentata da un raggio e un centro. (vedere la classe base ol.geom.Circleè ol.geom.SimpleGeometrynon ol.geom.Polygon) GeoJSON, WKT, e KML non hanno geometrie circolari in loro specifica e richiedono la conversione prima della formattazione. Si prega di vedere la mia risposta per un modo per approssimare un ol.geom.Circledi un vero poligono.
nagytech,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.