На чем основаны координаты в открытом слое 3 и как они работают? - PullRequest
0 голосов
/ 03 марта 2020

Я новичок, чтобы открыть слой 3, и я нашел пример рисования многоугольника :

Я видел в примере, что вы создаете векторный слой и в этом слое вы даете это гео JSON в качестве источника, гео JSON имеет особенности, которые выглядят примерно так:

{
    'type': 'Feature',
    'geometry': {
      'type': 'Polygon',
      'coordinates': [[[-5e6, -1e6], [-4e6, 1e6], [-3e6, -1e6]]]
}

Теперь это работает, и я получаю хороший полигон, что я не знаю, так это то, что это координаты? я имею в виду, что такое -5e6?!, если у меня есть long и lat, такие как:

 [[36.301744, 50.010456], [36.302180, 50.019864], [36.301025, 50.021730], [36.293856, 50.016215], [66.293682, 56.009240], [66.301744, 56.010456]]

Как я могу преобразовать его в эти координаты?,
На самом деле я выполнил поиск и я нашел несколько ссылок:
открыть слои 3, как нарисовать многоугольник программно?
Но после использования:

polygon.transform('EPSG:4326', 'EPSG:3857');  

К transform мои координаты (которые я до сих пор не знаю, во что я преобразую, потому что я не знаю, что означает что-то вроде -5e6), я все еще не получил никакого результата
Может кто-нибудь подсказать, на чем основаны эти координаты? и как они работают?
Спасибо.

Обновление 01:
Вот код, который я запускаю, что приводит к cannot read property length of undefined внутри geon/SimpleGeomerty:

const GeographicalMap = ({ onClick }) => {

    const myCoord = [[36.301744, 50.010456], [36.302180, 50.019864], [36.301025, 50.021730], [36.293856, 50.016215], [36.293682, 50.009240], [36.301744, 50.010456]]
    const newCoord = transform(myCoord, 'EPSG:4326', 'EPSG:3857')
    console.log('newCoord', newCoord)

    const geojsonObject = {
        'type': 'FeatureCollection',
        'crs': {
            'type': 'name',
            'properties': {
                'name': 'EPSG:4326'
            }
        },
        'features': [
            {
                'type': 'Feature',
                'geometry': {
                    'type': 'Polygon',
                    'coordinates': newCoord
                }
            },
        ]
    };


    var source = new VectorSource({
        features: (new GeoJSON()).readFeatures(geojsonObject)
    })

    var layer = new VectorLayer({
        source: source,
    });

    const layers = [layer]

    return (
        <Map
            onClick={onClick}
            layers={layers}
        />
    )
}  

Что меня больше всего беспокоит, так это то, что журнал консоли после преобразования показывает следующее:

[
  null,
  null,
  [
    36.301025,
    50.02173
  ],
  [
    36.293856,
    50.016215
  ],
  [
    36.293682,
    50.00924
  ],
  [
    36.301744,
    50.010456
  ]
]

Обновление 02:
Как следует из ответа cabesuon, я сейчас использую код ниже:

const myCoord = [[36.301744, 50.010456], [36.302180, 50.019864], [36.301025, 50.021730], [36.293856, 50.016215], [36.293682, 50.009240], [36.301744, 50.010456]]

    const polygon = new Polygon(myCoord);    
    polygon.transform('EPSG:4326', 'EPSG:3857');
    console.log('polygon', polygon)
    const feature = new Feature({
        geometry: polygon
    });

    const source = new VectorSource();
    source.addFeature(feature);

    const layer = new VectorLayer({
        source: source,
    });  

Но на карте ничего не нарисовано, после того, как консоль зарегистрировала многоугольник, я вижу проблема:

extent_: (4) [Infinity, Infinity, -Infinity, -Infinity]
ends_: (6) [0, 0, 0, 0, 0, 0]  

Я не знаю почему, но в моем коде что-то не так, что приводит к неправильным extent_ и ends_

1 Ответ

1 голос
/ 03 марта 2020

Чтобы приложение карты работало, вся информация, которую оно представляет, должна находиться в одной и той же системе пространственной привязки (SR), обычно определяемой базовой картой, например карты OSM, карты Bing и т. Д. c. Defacto SR для веб-карт - Web Mercator EPSG: 3857.

Теперь запрашиваемые вами координаты находятся в Web Mercator. Значения, которые вы видите, указаны в научной нотации c. Например, 1e6 = 1000000, другими словами, это означает 1x10 ^ 6.

Если ваши координаты в географических точках c (EPSG: 4326), вам необходимо преобразовать его в SR, который использует карта , polygon.transform('EPSG:4326', 'EPSG:3857') преобразует географические c координаты в Web Mercator, если ваша карта использует Web Mercator (вероятно, если у вас есть базовая веб-карта), она должна работать.

Обновление вопроса

В вашем коде есть несколько проблем,

  1. у вас есть массив координат, а не геометрия, вам нужно создать геометрию
  2. после применения преобразования к геометрия, прямо сейчас вы используете метод, который преобразует координату, а не массив
  3. вам не нужно создавать гео json для коллекции объектов, просто создайте объект и добавьте его в источник

Что-то вроде этого должно работать,

const coords = [[
  [36.301744, 50.010456], [36.302180, 50.019864], [36.301025, 50.021730],
  [36.293856, 50.016215], [36.293682, 50.009240], [36.301744, 50.010456]
]]; // edited on update 2
const polygon = new Polygon(coords);
polygon.transform('EPSG:4326', 'EPSG:3857');
const feature = new Feature({
  geometry: polygon
});
const source = new VectorSource();
source.addFeature(feature);

Обновление 2: в вашем массиве координат есть что-то, чего мне не хватает, дело в том, что для создания Polygon с имеющимися у вас координатами передать в качестве параметра массив колец, а кольцо - это массив координат, исправление которых работает нормально.

Здесь я сделал для вас пример,

<!doctype html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.1.1/css/ol.css" type="text/css">
    <style>
      .map {
        height: 400px;
        width: 100%;
      }
			#a { display: none; }
    </style>
    <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.1.1/build/ol.js"></script>
    <title>OL - Feature From Coords</title>
  </head>
  <body>
    <h2>Feature From Coords</h2>
    <div id="map" class="map"></div>
    <script type="text/javascript">
      // tile layer
      var tile = new ol.layer.Tile({
        source: new ol.source.OSM()
      });
      // vector layer
      const coords = [
        [
          [36.301744, 50.010456],
          [36.302180, 50.019864],
          [36.301025, 50.021730],
          [36.293856, 50.016215],
          [36.293682, 50.009240],
          [36.301744, 50.010456]
        ]
      ];
      const polygon = new ol.geom.Polygon(coords);
      polygon.transform('EPSG:4326', 'EPSG:3857');
      const feature = new ol.Feature({
        geometry: polygon
      });
      const source = new ol.source.Vector();
      source.addFeature(feature);
      var vector = new ol.layer.Vector({
        source,
        style: new ol.style.Style({
          stroke: new ol.style.Stroke({
            color: 'red',
            width: 3
          }),
          fill: new ol.style.Fill({
            color: 'rgba(255, 0, 0, 0.1)'
          })
        })
      })
      var map = new ol.Map({
        layers: [
          tile,
          //image,
          vector
        ],
        target: 'map',
        view: new ol.View({
          center: ol.proj.fromLonLat([36.301025, 50.021730]),
          zoom: 12
        })
      });
    </script>
  </body>
</html>
...