2015-07-01 1 views
1

Я использую скрипт python gdal_polygonize для полигонализации растрового изображения и сохранения полигонов в базе данных postgres. Пока все работало нормально.Информация о проекции python gdal

gdal_polygonize.py abia.tif -f PostgreSQL PG:"dbname='abiaDB' host='127.0.0.1' port='5434' user='postgres' password='****'" mylayer 

После сохранения данных в базе данных я экспортировать его оттуда как GeoJSON файл, который я хочу, чтобы отобразить с Leaflat. Поэтому Leaflat работает только с проекцией EPSG: 4326. Поэтому я использовал плагин proj4.js, который выполняет преобразование из зоны Гаусса-Крюгера 4 EPSG: 31468. Так что я должен определить исходную проекцию Мануалы в коде, как что:

proj4.defs('EPSG:31468', '+proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +units=m +no_defs'); 

L.Proj.geoJson(data, { 
    'pointToLayer': function(feature, latlng) { 
    return L.marker(latlng).bindPopup(feature.properties.name); 
    } 
}).addTo(map); 

Есть ли способ, что я могу сказать, сценарий питона, что он также должен хранить информацию проекционной в базе данных. Моя цель состоит в том, что визуализация более автоматизирована, поэтому, когда есть другое изображение, с другой проекцией, он должен получить информацию о проекции из базы данных. Есть ли способ, который я могу сказать функции gdal_polygonize, чтобы он хранил информацию в дополнительной строке или что-то в этом роде?

Polygonize Java

gdal.AllRegister(); 
ogr.RegisterAll(); 
args = gdal.GeneralCmdLineProcessor(args); 

//Open source file 
Dataset hDataset = gdal.Open(args[0], gdalconstConstants.GA_ReadOnly);   
Band rasterBand = hDataset.GetRasterBand(1); 
Band maskBand = rasterBand.GetMaskBand(); 

Driver driver = ogr.GetDriverByName("Memory"); 
DataSource dataSource = driver.CreateDataSource("mem"); 

SpatialReference srs = null; 
if(!hDataset.GetProjectionRef().isEmpty()) 
    srs = new SpatialReference(hDataset.GetProjectionRef()); 

Layer outputLayer = dataSource.CreateLayer("mylayer", srs); 
FieldDefn field_def = new FieldDefn("DN",ogr.OFTInteger); 
outputLayer.CreateField(field_def); 
gdal.Polygonize(rasterBand, maskBand, outputLayer, 0, new Vector<>(), new TermProgressCallback()); 

//Transformation  
DataSource dataDest = driver.CreateDataSource("mem2"); 
//Create destination projection 
SpatialReference dst = new SpatialReference(); 
dst.ImportFromEPSG(4326); 

CoordinateTransformation ct = CoordinateTransformation.CreateCoordinateTransformation(srs, dst); 

//Write data to database 
DataSource dataSourceDb = ogr.Open("PG:dbname='abiaDB' host='127.0.0.1' port='5434' user='postgres' password='****'", 1); 
dataSourceDb.CopyLayer(outputLayer, "mylayer"); 

ответ

1

Одна идея состоит в том, что вы могли бы изменить gdal_polygonize.py повторно проекту результат. Используйте MEM-драйвер для хранения промежуточного полигонизируемого результата с dst_layer, затем выполните перепрограммирование с использованием модуля osr.

Другая идея, что гораздо проще это сделать обзор базы данных, который проецирует столбец геометрии таблицы с SRID = 4326 с использованием , т.е.

CREATE VIEW mytable_latlong AS 
    SELECT gid, ST_Transform(geom, 4326) AS geom, ... 
    FROM mytable 
+0

Привет, спасибо за Ваш ответ. Я сделал это на Java, добавил код выше. В этом примере я пишу после полигонизации результата в базу данных. У вас есть пример, как сделать преобразование, прежде чем записывать его в базу данных? – user2644964

+0

Хорошо, я делаю вещи с сохранением результата в mem и записываю его в базу данных. У меня только проблемы, связанные с трансформацией. – user2644964