открытые слои LineString не работают

Извините, что беспокою вас, ребята, но я застрял с его проблемой на полдня.

Я хочу нарисовать полилинию в OpenLayers, используя объект LineString, поэтому я скопировал пример из документации. Работает нормально, но я не вижу линии на экране

Код выглядит так

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <head>
        <title></title>
    <script type="text/javascript"  src="http://openlayers.org/api/OpenLayers.js"></script>
    <script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script>
    <script src='http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script> 

  <script type="text/javascript">    

var map;
var lineLayer ;
var points;
var style;

var polygonFeature
  function test()
  {
    lineLayer = new OpenLayers.Layer.Vector("Line Layer"); 
    style = { strokeColor: '#0000ff', 
                strokeOpacity: 1,
                strokeWidth: 10
    };

    map.addLayer(lineLayer);                    

    points = new Array();
    points[0] =new OpenLayers.LonLat(-2.460181,27.333984 ).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());;
    points[1] = new OpenLayers.LonLat(-3.864255,-22.5 ).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());;   
    var linear_ring = new OpenLayers.Geometry.LinearRing(points);
    polygonFeature = new OpenLayers.Feature.Vector(
            new OpenLayers.Geometry.Polygon([linear_ring]), null, style);
    lineLayer.addFeatures([polygonFeature]);
    alert("1");

  }

  function initialize() 
  {    
      map = new OpenLayers.Map ("map_canvas", {
            controls:[
                new OpenLayers.Control.Navigation(),
                new OpenLayers.Control.PanZoomBar(),
                new OpenLayers.Control.LayerSwitcher(),
                new OpenLayers.Control.Attribution()],
            maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
            maxResolution: 156543.0399,
            numZoomLevels: 19,
            units: 'm',
            projection: new OpenLayers.Projection("EPSG:900913"),
            displayProjection: new OpenLayers.Projection("EPSG:4326")
          });

        // Define the map layer
        // Here we use a predefined layer that will be kept up to date with URL changes
        layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
        map.addLayer(layerMapnik);
      var lonLat = new OpenLayers.LonLat(0, 0).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
        map.zoomTo(3);
        map.setCenter(lonLat, 19);  

    test();
  }

  </script>
    </head>

    <body onload="initialize()" >

    <div id="map_canvas" style="width: 828px; height: 698px"></div>  
  </body>

</html>

Я уверен, что мне не хватает какого-то параметра при создании карты или что-то в этом роде, но я действительно не могу понять, какой именно.


person AlexS    schedule 17.02.2011    source источник


Ответы (2)


Вы забыли символ '' в этой строке:

lineLayer.addFeatures([lineFeature]);

Функция addFeature не существует: OpenLayers.Layer.Vector.addFeatures

Чтобы увидеть эту функцию, удерживайте клавишу Shift на клавиатуре и попробуйте нарисовать прямоугольник.

EDIT: Хорошо, теперь я знаю, как вы хотели.

Вам нужно создать один объект OpenLayers.Point для каждой точки в вашей БД. Одним из решений является использование Ajax-вызова вашей собственной PHP-функции для их извлечения. Файл PHP включает код для их получения. Я рекомендую возвращать их в формате JSON (возможно, в виде строки). Используя структуру JQuery:

$.ajax({
   url: 'your_php_file.php',
   dataType: JSON // for example, you can use 'string' type too
   success: function(coordinates){

   }
});

Теперь у вас есть много координат из вашей БД. Пришло время нарисовать полигон. Следующая ссылка может быть полезной

OpenLayers - как нарисовать полигон из существующих lonLat точек?

Надеюсь, это тебе поможет. Удачного кодирования!

EDIT2:

linear_ring — это объект класса OpenLayers.Geometry.LinearRing. конструктору нужен массив OpenLayers.Geometry.Points, и вы давали ему массив OpenLayers.LonLat.

Вам нужно изменить это, добавив эту строку после создания каждой точки (изменив индекс в соответствии с вашим собственным кодом):

points[0] = new OpenLayers.Geometry.Point(points[0].lon,points[0].lat);

Итак, ваша тестовая функция выглядит так:

function test(){
      lineLayer = new OpenLayers.Layer.Vector("Line Layer");
      style = { strokeColor: '#0000ff',
         strokeOpacity: 1,
         strokeWidth: 10
      };

      points = new Array();

      points[0] =new OpenLayers.LonLat(-2.460181,27.333984 ).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());;
      points[0] = new OpenLayers.Geometry.Point(points[0].lon,points[0].lat);

      points[1] = new OpenLayers.LonLat(-3.864255,-22.5 ).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());;
      points[1] = new OpenLayers.Geometry.Point(points[1].lon,points[1].lat);

      var linear_ring = new OpenLayers.Geometry.LinearRing(points);
      polygonFeature = new OpenLayers.Feature.Vector(
         new OpenLayers.Geometry.Polygon([linear_ring]), null, style);
         lineLayer.addFeatures([polygonFeature]);

      map.addLayer(lineLayer);

 }

Результат такой: Результат изображения

person Fran Verona    schedule 17.02.2011
comment
Привет. Спасибо за ответ. С моей стороны было глупо не проверить синтаксис. Я сделал это сейчас. Тем не менее я не вижу линии. Я пытался удерживать Shift и рисовать прямоугольник, но он просто увеличивает выбранную область, линия не видна. Может я не совсем понимаю функциональность. Мне нужно нарисовать полилинию из моей программы, а не кликая по карте. Возможно ли это? - person AlexS; 18.02.2011
comment
@AlexS Не волнуйтесь, просто попробуйте адаптировать следующий пример к своему коду. Это просто. Если вам нужна помощь, я могу помочь вам openlayers.org/dev/examples/draw -feature.html - person Fran Verona; 18.02.2011
comment
Привет, Фрэн. Спасибо за помощь. Возможно, мы не понимаем друг друга. Я видел пример функции рисования. Это работает нормально. Но это не делает то, что мне нужно сделать. У меня есть массив точек в хранилище БД, который я хочу представить в виде полилинии на карте. Мне не нужно рисовать их, нажимая на карту. Могу ли я сделать это с помощью OpenLayers API? Можете ли вы прислать мне пример скрипта, который это делает? Спасибо. - person AlexS; 20.02.2011
comment
Хорошо, я отредактировал мой код, чтобы он был похож на код, который вы предоставили в своем последнем сообщении. Все еще не повезло. - person AlexS; 20.02.2011
comment
Не могли бы вы скопировать и вставить его в текстовый файл, изменить расширение на HTML, запустить его на своем ПК и сказать мне, работает ли он для вас. Спасибо. - person AlexS; 20.02.2011
comment
Большое спасибо за вашу помощь. - person AlexS; 21.02.2011

Да, OpenLayers может программно рисовать линии. Это даже достаточно быстро, чтобы рисовать новые линии несколько раз в секунду, чтобы вы могли показывать живые данные или анимацию. В любом случае, у вас много чего происходит в вашем коде. Возможно, ваш стиль перепутался и вы рисуете невидимые линии, или ваши точки данных трансформируются неправильно, и линия отсутствует на карте. В любом случае, я предлагаю этот простой тест.

Создайте карту и добавьте векторный слой. держитесь за векторный слой в глобальной переменной с именем layerVec. Затем запустите этот код.

var CreateLine = function()
{

  var pList = new Array();
  for(var i=0; i<200; i++)
  {
    var p = new OpenLayers.Geometry.Point();
    p.x = i;
    p.y = i;
    pList.push(p);
  }
  var g = new OpenLayers.Geometry.LineString(pList);
  var f = new OpenLayers.Feature.Vector(g,null,null);
  layerVec.addFeatures(f);
};

Пока не беспокойтесь о координатах, это должна быть линия посередине карты. Он может быть крошечным или огромным в зависимости от вашей проекции, поэтому увеличьте масштаб.

person rocketsarefast    schedule 05.01.2012