Wie erstelle ich ein kreisförmiges Polygon in OpenLayer 3?


9

Daher möchte ich dieses Beispiel wirklich ändern: http://openlayers.org/en/v3.0.0/examples/tissot.html?q=circle

Das Problem ist, dass es nicht funktioniert, wenn ich versuche, es auf meine Karte anzuwenden, wahrscheinlich weil ich einen OSM-Stil verwende, der nicht sphärisch ist:

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

Und für die Frage: Wie erstelle ich ein kreisförmiges Polygon? Wie ich sehen kann, gibt es zwei Möglichkeiten:

  1. Konvertiere geom.Circle irgendwie in geom.Polygon, was ich basierend auf meinem Noob-Level nicht kann

  2. Erstellen Sie dazu meine eigene Funktion, so etwas wie Openlayers 2:

    OpenLayers.Geometry.Polygon.createRegularPolygon = Funktion (Ursprung, Radius, Seiten, Drehung) {
    var angle = Math.PI * ((1 / Seiten) - (1/2)); if (Drehung) {Winkel + = (Drehung / 180) * Math.PI; } var rotatedAngle, x, y; var points = []; für (var i = 0; i

Hat jemand den gleichen Punkt in seinem GIS-Meisterleben erreicht? Welches ist besser? oder gibt es einen versteckten weg, den nur weise und starke sehen können? Hilf mir bitte!

Antworten:


11

Wie andere richtig betont haben, unterstützen die Formate GeoJSON und WKT in keiner Weise kreisförmige Geometrien. Kreise sind auch nicht in der KML-Spezifikation enthalten. Dies macht es schwierig, einen Kartenrahmen an KML, GeoJSON oder WKT zu schreiben.

OpenLayers v3 bietet die Möglichkeit, einen Kreis mit einem Polygon zu approximieren, ist jedoch nicht besonders hübsch, da es sich um die Konvertierung in große Kreisentfernungen handelt. Die API-Referenz für die ol.geom.Polygon.circularMethode finden Sie hier: http://openlayers.org/en/v3.5.0/apidoc/ol.geom.Polygon.html#circular

Ein Beispiel für die ol.geom.Polygon.circularMethode ist unten gezeigt, kann aber auch in diesem OpenLayers-Beispiel für eine Gewebeanzeige gesehen werden .

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

Alternativ können Sie verwenden, fromCirclewas zum Zeitpunkt dieses Beitrags experimentell ist.

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

Für etwas, mit dem Sie spielen können, finden Sie meine jsFiddle hier: https://jsfiddle.net/a1syw4od/9/


Ich könnte eine Bearbeitung vorschlagen, aber vielleicht ist es einfacher, wenn Sie sie beheben: Das letzte Beispiel sollte ol.geom.Polygon.fromCircle eher als verwenden ol.geom.Polygon.circular. Prost!
Arjan

0

Wenn Sie ein einfaches kreisförmiges Polygon erstellen möchten, verwenden Sie:

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

Quelle: http://openlayers.org/en/v3.0.0/apidoc/ol.geom.Circle.html (entfernen Sie das stabile Häkchen oben auf der Seite)


Dies ist gültig, hat jedoch derzeit Probleme, wenn Sie versuchen möchten, die Funktion in GeoJSON zu konvertieren. Siehe github.com/openlayers/ol3/pull/3237#issuecomment-78475413
Darren Reid

auch wenn Sie versuchen, Geometrie in wkt mit writeWKT zu extrahieren.
Suraj

1
ol.geom.Circleist kein Polygon, sondern eine einfache Geometrie, die durch einen Radius und einen Mittelpunkt dargestellt wird. (siehe Basisklasse von ol.geom.Circleist ol.geom.SimpleGeometrynicht ol.geom.Polygon) GeoJSON, WKT und KML haben keine kreisförmigen Geometrien in ihrer Spezifikation und müssen vor der Formatierung konvertiert werden. In meiner Antwort finden Sie eine Möglichkeit, ein ol.geom.Circledurch ein echtes Polygon zu approximieren .
Nagytech
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.