OpenLayers метры в shp-файлах

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
mixa1977
Новоприбывший
Сообщения: 6
Зарегистрирован: 22 окт 2014, 10:21
Репутация: 0

OpenLayers метры в shp-файлах

Сообщение mixa1977 » 22 окт 2014, 10:32

Есть код, смысл чтение из shp файла контуров и наложение на карту. Привожу только код главной процедуры:

Код: Выделить всё

  function init1(records) {
		var pj_4326 = new OpenLayers.Projection("EPSG:4326");
		var pj_900913 = new OpenLayers.Projection("EPSG:900913");
	var options = {
   projection: pj_900913,
   displayProjection: pj_4326,
   numZoomLevels: 18
};
	map = new OpenLayers.Map('mapdiv', options);
	map.addControl(
        new OpenLayers.Control.MousePosition({
            displayProjection: new OpenLayers.Projection('EPSG:4326')
        })
    	);
        //map = new OpenLayers.Map("mapdiv");
        var mapnik = new OpenLayers.Layer.OSM();
        map.addLayer(mapnik);
	var siteStyle = {
	'fillOpacity':0.2,
	'strokeColor':'#FE2E2E'
	};
        //МАРКЕР выводится правильно
        var lonlat = new OpenLayers.LonLat(40,57).transform(
            pj_4326, // transform from WGS 1984
            pj_900913 // to Spherical Mercator
          );

        var zoom = 13;
        var markers = new OpenLayers.Layer.Markers( "Markers" );
        map.addLayer(markers);
        markers.addMarker(new OpenLayers.Marker(lonlat));
	var pole = new OpenLayers.Layer.Vector( "Pole" );
	map.addLayer(pole);

  //for (var i = 0; i < records.length; i++) {
    for (var i = 0; i < 10; i++) {
    var record = records[i];
    if (record.shapeType == ShpType.SHAPE_POLYGON || record.shapeType == ShpType.SHAPE_POLYLINE) {
      var shp = record.shape;
      for (var j = 0; j < shp.rings.length; j++) {
        var ring = shp.rings[j];
        if (ring.length < 1) continue;

	var sitePoints = [];
        
        for (var k = 0; k < ring.length; k++) {
                //ВЕРШИНЫ полигонов считаны из shp-файла, в градусах. Выводятся не правильно!
		var point = new OpenLayers.Geometry.Point(ring[k].x, ring[k].y);
		document.getElementById('label').innerHTML=ring[k].x;
		sitePoints.push(point);
          
        }
	sitePoints.push(sitePoints[0]);
	var linearRing = new OpenLayers.Geometry.LinearRing(sitePoints);
	var geometry = new OpenLayers.Geometry.Polygon([linearRing]);
	var polygonFeature = new OpenLayers.Feature.Vector(geometry, null, siteStyle);
        pole.addFeatures([polygonFeature]);
		
      }
    }
  }

	map.addControl(new OpenLayers.Control.LayerSwitcher());
        map.setCenter(lonlat, zoom);
      }
Суть проблемы:
1. Маркер

Код: Выделить всё

var lonlat = new OpenLayers.LonLat(40,57).transform(
            pj_4326, // transform from WGS 1984
            pj_900913 // to Spherical Mercator
          );
накладывается правильно, оно и понятно у него координаты в градусах (широта/долгота)
2. А вот точки вершин полигонов

Код: Выделить всё

var point = new OpenLayers.Geometry.Point(ring[k].x, ring[k].y);
, считываются из shp-файла и их координаты в метрах. В результате они накладываются где в районе Франции и не в том масштабе.
Понимаю, что должна быть какая-то трансформация их координат в проекцию EPSG:900913.
Подскажите, как быть.
Спасибо.

trir
Гуру
Сообщения: 5354
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: OpenLayers метры в shp-файлах

Сообщение trir » 22 окт 2014, 11:08

Никогда не понимал людей - которые употребляют слова .shp и OpenLayers в одном предложении
Почему бы не конвертировать .shp силами QGIS или OGR в GML (EPSG:4326) и работать дальше с нормальным xml'ем?

ol.proj.transform

mixa1977
Новоприбывший
Сообщения: 6
Зарегистрирован: 22 окт 2014, 10:21
Репутация: 0

Re: OpenLayers метры в shp-файлах

Сообщение mixa1977 » 22 окт 2014, 12:16

Спасибо за ответ конечно. Но если идти по этому пути, то нужно будет еще разбираться как потом работать с полученным xml. Я ведь новичок.
А у меня уже все готово, надо только преобразовать координаты полигонов из метров в градусы.
Вот как это сделать?

trir
Гуру
Сообщения: 5354
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: OpenLayers метры в shp-файлах

Сообщение trir » 22 окт 2014, 12:25

Какая СК у исходного .shp'а?
Вот как это сделать?
Я же ответил, использовать ol.proj.transform
как потом работать с полученным xml
ol.format.GML

mixa1977
Новоприбывший
Сообщения: 6
Зарегистрирован: 22 окт 2014, 10:21
Репутация: 0

Re: OpenLayers метры в shp-файлах

Сообщение mixa1977 » 22 окт 2014, 13:25

СК: GCS_WGS_1984
Вы, наверное, имели в виду метод transform:

Код: Выделить всё

var point = new OpenLayers.Geometry.Point(ring[k].x, ring[k].y).transform(
new OpenLayers.Projection("EPSG:32637"),
new OpenLayers.Projection("EPSG:900913"));
пробовал, не получается.
У меня WGS 1984 / UTM zone 37N.
Датум: D_WGS_1984
Может это поможет?

trir
Гуру
Сообщения: 5354
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: OpenLayers метры в shp-файлах

Сообщение trir » 22 окт 2014, 14:28

А если x,y поменять?
А что выходит? Какие координаты получаются на выходе?

mixa1977
Новоприбывший
Сообщения: 6
Зарегистрирован: 22 окт 2014, 10:21
Репутация: 0

Re: OpenLayers метры в shp-файлах

Сообщение mixa1977 » 22 окт 2014, 15:56

1. Если делаю так:

Код: Выделить всё

var point = new OpenLayers.Geometry.Point(ring[k].x, ring[k].y).transform(
new OpenLayers.Projection("EPSG:32637"),
new OpenLayers.Projection("EPSG:900913"));
Контура остаются в прежнем положение
2. Если меняю местами x,y без трансформации:

Код: Выделить всё

var point = new OpenLayers.Geometry.Point(ring[k].y, ring[k].x);
Контура появляются в районе Индийского океана.
3. Если меняю x,y и делаю трансформацию как в п.1, они опять же в Индийском океане.

Такое чувство, что трансформация не работает.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers метры в shp-файлах

Сообщение Denis Rykov » 22 окт 2014, 16:19

Оно и не будет работать. OpenLayers из коробки понимает ограниченный набор проекций. Вам нужно подключать proj4js.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers метры в shp-файлах

Сообщение Denis Rykov » 22 окт 2014, 17:11

Вот рабочий пример:

Код: Выделить всё

Proj4js.defs["EPSG:32637"]="+proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs";

var lonlat = new OpenLayers.Geometry.Point(36.5, 50.5);
console.log('Input coordinates: ' + lonlat.toString());

lonlat.transform(new OpenLayers.Projection('EPSG:4326'), new OpenLayers.Projection('EPSG:32637'));
console.log('4326 -> 32637: ' + lonlat.toString());

lonlat.transform(new OpenLayers.Projection('EPSG:32637'), new OpenLayers.Projection('EPSG:4326'));
console.log('32637 -> 4326: ' + lonlat.toString());
Результат:

Код: Выделить всё

Input coordinates: POINT(36.5 50.5)
4326 -> 32637: POINT(322708.0339315607 5597210.83080934)
32637 -> 4326: POINT(36.49999999852607 50.49999999995558)
proj4js подключал отсюда, описание проекции отсюда.
Spatial is now, more than ever, just another column- The Geometry Column.

mixa1977
Новоприбывший
Сообщения: 6
Зарегистрирован: 22 окт 2014, 10:21
Репутация: 0

Re: OpenLayers метры в shp-файлах

Сообщение mixa1977 » 22 окт 2014, 17:23

Я понял, что получается очень сложно и в результате бестолково.
Решил пойти по другому пути, конвертировал shp в gml:
ogr2ogr -f "GML" "c:\Downloads\1.gml" "C:\1.shp" -s_srs EPSG:32637 -t_srs EPSG:900913
1.gml положил на сервер в папку thematicmapping.
Переписал код для слоя полигонов:

Код: Выделить всё

map.addLayer(new OpenLayers.Layer.Vector("Pole", {
    strategies: [   new OpenLayers.Strategy.Fixed()],
    protocol:       new OpenLayers.Protocol.HTTP({
        url: "thematicmapping/1.gml",
        format: gml_format
    }),
    styleMap: RegionsStyles,
    visibility: true
}));
Результат, не появляется слой "Pole".
Правильно ли я выбрал проекцию EPSG:32637 для конвертации ogr2ogr?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers метры в shp-файлах

Сообщение Denis Rykov » 22 окт 2014, 17:28

Разве мой пример сложный? Вроде всё предельно просто. То что слой не появляется на карте - это может быть обусловлено множеством причин, во-первых посмотрите в консоли браузера запрашиваются ли ваши данные с сервера в принципе. И еще - не надо GML, в вебе, обычно, используют GeoJSON.
Spatial is now, more than ever, just another column- The Geometry Column.

mixa1977
Новоприбывший
Сообщения: 6
Зарегистрирован: 22 окт 2014, 10:21
Репутация: 0

Re: OpenLayers метры в shp-файлах

Сообщение mixa1977 » 22 окт 2014, 17:46

Я попробую по-вашему, обязательно. Но я не к тому, что Вы сложно описали.
А вообще, в целом, у меня получается сложно:
shp-фалы читаю с помощью сторонних модулей, да еще и трансформацию надо делать.
А вот как понял gml наложить проще, все уже готово и трансформировать не надо, он уже в нужной проекции.

Только вот пока и с gml не получается.
Ну слой не то что бы не создается, он есть. Вопрос где он появляется и в какой проекции. Думаю, что неправильно создаю gml вектор. Завтра на работе попробую.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers метры в shp-файлах

Сообщение Denis Rykov » 22 окт 2014, 17:57

Точно также шейп можно перепроецировать в GeoJSON. А проще всего проверить, что все верно трансформировалось можно в настольном клиенте (QGIS).

[ Сообщение с мобильного устройства ]
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя