Comment créer un polygone circulaire dans openlayers 3?


10

Je voudrais donc vraiment modifier cet exemple: http://openlayers.org/en/v3.0.0/examples/tissot.html?q=circle

Le problème est que lorsque j'essaie de l'appliquer à ma carte, cela ne fonctionne pas, probablement parce que j'utilise un style OSM qui n'est pas sphérique:

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

Et pour la question: comment créer un polygone circulaire? Comme je peux le voir, il y a deux choix:

  1. D'une manière ou d'une autre, convertir geom.Circle en geom.Polygon, ce que je ne peux pas faire, en fonction de mon niveau de noob

  2. Créer ma propre fonction pour ce faire, quelque chose comme openlayers 2:

    OpenLayers.Geometry.Polygon.createRegularPolygon = fonction (origine, rayon, côtés, rotation) {
    angle var = Math.PI * ((1 / côtés) - (1/2)); if (rotation) {angle + = (rotation / 180) * Math.PI; } var rotatedAngle, x, y; var points = []; pour (var i = 0; i

Quelqu'un est-il arrivé au même point dans sa vie de maître SIG? Quel est le meilleur? ou existe-t-il un chemin caché, que seuls les sages et les forts peuvent voir? Aidez-moi s'il vous plaît!

Réponses:


13

Comme d'autres l'ont correctement souligné, les formats GeoJSON et WKT ne prennent en aucun cas en charge les géométries circulaires. Les cercles ne sont pas non plus dans la spécification KML. Cela complique la tâche d'écrire un cadre de carte en KML, GeoJSON ou WKT.

OpenLayers v3 a un moyen d'approximer un cercle avec un polygone, mais ce n'est pas joli car cela implique une conversion en grande distance de cercle. Voir la référence API pour la ol.geom.Polygon.circularméthode ici: http://openlayers.org/en/v3.5.0/apidoc/ol.geom.Polygon.html#circular

Un exemple de la ol.geom.Polygon.circularméthode est montré ci-dessous, mais peut également être vu dans cet exemple d'indicateur de tissu OpenLayers .

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

Alternativement, vous pouvez utiliser fromCirclece qui, au moment de cet article, est expérimental.

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

Pour quelque chose avec lequel vous pouvez jouer, consultez mon jsFiddle ici: https://jsfiddle.net/a1syw4od/9/


Je pourrais proposer une modification, mais c'est peut-être plus facile si vous le corrigez: le dernier exemple devrait utiliser ol.geom.Polygon.fromCircle plutôt que ol.geom.Polygon.circular. À votre santé!
Arjan

0

Si vous souhaitez créer un simple polygone circulaire, utilisez:

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

Source: http://openlayers.org/en/v3.0.0/apidoc/ol.geom.Circle.html (supprimez la coche stable en haut de la page)


Ceci est valide, mais présente actuellement des problèmes si vous avez l'intention d'essayer de convertir la fonctionnalité en GeoJSON. Voir github.com/openlayers/ol3/pull/3237#issuecomment-78475413
Darren Reid

également lorsque vous essayez d'extraire la géométrie dans wkt à l'aide de writeWKT.
Suraj

1
ol.geom.Circlen'est pas un polygone, c'est une géométrie simple représentée par un rayon et un centre. (voir la classe de base ol.geom.Circlen'est ol.geom.SimpleGeometrypas ol.geom.Polygon) GeoJSON, WKT et KML n'ont pas de géométries circulaires dans leurs spécifications et nécessitent une conversion avant le formatage. S'il vous plaît voir ma réponse pour un moyen d'approximer un ol.geom.Circlepar un vrai polygone.
nagytech
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.