Как отобразить пространственное поле на карте? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть пространственное поле в моей Django модели. Я хочу отобразить это поле на карте. Как это сделать? Он отлично работает в Django Admin с Django встроенными OSMWidget и OpenLayers.

Если я пытаюсь получить доступ к пространственному полю в моем шаблоне, он имеет следующий формат:

SRID=4326;GEOMETRYCOLLECTION (POLYGON ((54.57842969715517 23.34800720214843, 54.53144199643833 23.29547882080078, 54.52964902093564 23.38096618652343, 54.57444978782305 23.40499877929688, 54.57842969715517 23.34800720214843)))

1 Ответ

0 голосов
/ 28 апреля 2020

Формат WKT (общеизвестный текст), а для OL вам просто нужно использовать ol.format.WKT для чтения всех или отдельных функций ( OL API - формат WKT ).

Я поставил этот пример для вас, основываясь на примере OL Примеры OL - WKT . Я хотел показать особенность или GEOMETRYCOLLECTION, что она может содержать различные типы геометрии, ведь это не всегда нужно.

<!doctype html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.3.1/css/ol.css" type="text/css">
    <style>
      .map {
        height: 400px;
        width: 100%;
      }
    </style>
    <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.3.1/build/ol.js"></script>
    <title>WKT Geometry</title>
  </head>
  <body>
    <h2>My Map</h2>
    <div id="map" class="map"></div>
    <script type="text/javascript">
      const wkt = 'GEOMETRYCOLLECTION('+
        'MULTIPOINT(-2 3 , -2 2),'+
        'LINESTRING(5 5 ,10 10),'+
        'POLYGON((-7 4.2,-7.1 5,-7.1 4.3,-7 4.2)))';

      const format = new ol.format.WKT();

      const features = format.readFeatures(wkt, {
        dataProjection: 'EPSG:4326',
        featureProjection: 'EPSG:3857'
      });

      const vector = new ol.layer.Vector({
        source: new ol.source.Vector({
          features
        }),
        style: new ol.style.Style({
          fill: new ol.style.Fill({
            color: 'rgba(255, 255, 255, 0.2)'
          }),
          stroke: new ol.style.Stroke({
            color: '#ff3333',
            width: 2
          }),
          image: new ol.style.Circle({
            radius: 7,
            fill: new ol.style.Fill({
              color: '#ff3333'
            })
          })
        })
      });

      const map = new ol.Map({
        target: 'map',
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
          }),
          vector
        ],
        view: new ol.View({
          center: ol.proj.fromLonLat([0, 5]),
          zoom: 5
        })
      });
    </script>
  </body>
</html>
...