Jak stworzyć wielokąt kołowy w openlayers 3?

10

Naprawdę chciałbym zmodyfikować ten przykład: http://openlayers.org/en/v3.0.0/examples/tissot.html?q=circle

Problem polega na tym, że kiedy próbuję zastosować go do mojej mapy, nie działa, prawdopodobnie dlatego, że używam stylu OSM, który nie jest kulisty:

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

I na pytanie: jak stworzyć okrągły wielokąt? Jak widzę, są dwie możliwości:

  1. Jakoś przekonwertuj geom.Circle w geom.Polygon, czego nie mogę zrobić, na podstawie mojego poziomu nooba

  2. Utwórz własną funkcję, aby to zrobić, coś w stylu openlayers 2:

    OpenLayers.Geometry.Polygon.createRegularPolygon = funkcja (początek, promień, boki, obrót) {
    zmienny kąt = Math.PI * ((1 / boki) - (1/2)); if (obrót) {kąt + = (obrót / 180) * Math.PI; } var rotatedAngle, x, y; var points = []; dla (var i = 0; i

Czy ktoś osiągnął ten sam punkt w życiu mistrza GIS? Który jest lepszy? czy istnieje ukryta ścieżka, którą widzą tylko Mądrzy i Silni? Pomóż mi proszę!

użytkownik1929437
źródło

Odpowiedzi:

13

Jak inni słusznie zauważyli, formaty GeoJSON i WKT w żaden sposób nie obsługują geometrii kołowych. Kręgi też nie są w specyfikacji KML. Utrudnia to zapisywanie ramki mapy w KML, GeoJSON lub WKT.

OpenLayers v3 ma sposób na przybliżenie okręgu za pomocą wielokąta, ale nie jest ładny, ponieważ wymaga konwersji na dużą odległość koła. Zobacz referencję API dla ol.geom.Polygon.circularmetody tutaj: http://openlayers.org/en/v3.5.0/apidoc/ol.geom.Polygon.html#circular

Przykład ol.geom.Polygon.circularmetody pokazano poniżej, ale można ją również zobaczyć w tym przykładzie tkanek wskazujących OpenLayers .

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

Możesz też użyć fromCircletego, który w momencie pisania tego postu jest eksperymentalny.

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

Aby uzyskać coś, z czym można grać, zobacz mój jsFiddle tutaj: https://jsfiddle.net/a1syw4od/9/

nagytech
źródło
Mógłbym zaproponować edycję, ale może to łatwiejsze, jeśli to naprawisz: ostatni przykład powinien ol.geom.Polygon.fromCircle raczej użyć niż ol.geom.Polygon.circular. Twoje zdrowie!
Arjan
0

Jeśli chcesz utworzyć prosty wielokąt, użyj:

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

Źródło: http://openlayers.org/en/v3.0.0/apidoc/ol.geom.Circle.html (usuń zaznaczenie stabilne u góry strony)

Mubaryus
źródło
Jest to poprawne, ale obecnie występują problemy, jeśli zamierzasz spróbować przekonwertować obiekt na GeoJSON. Zobacz github.com/openlayers/ol3/pull/3237#issuecomment-78475413
Darren Reid
także podczas próby wyodrębnienia geometrii w wkt przy użyciu writeWKT.
Suraj
1
ol.geom.Circlenie jest wielokątem, to prosta geometria reprezentowana przez promień i środek. (patrz klasa podstawowa nie ol.geom.Circlejest ) GeoJSON, WKT i KML nie mają w specyfikacji geometrii kołowych i wymagają formatowania przed formatowaniem. Proszę zobaczyć moją odpowiedź na sposób przybliżenia prawdziwego wielokąta. ol.geom.SimpleGeometryol.geom.Polygonol.geom.Circle
nagytech