0

问候 GIS 爱好者和 WEB 制作者。我有一个关于预测的问题,更准确地说是在 Openlayers 4 中从 EPSG:3765 重新投影到 EPSG:3857。

在下面的代码中,我试图从 EPSG:3765 重新投影到 EPSG:3857 :

    proj4.defs(
        'EPSG:3765',
        '+proj=tmerc +lat_0=0 +lon_0=16.5 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs'
    );

var map = new ol.Map({
    view: new ol.View({
        zoom: 6,
        center: ol.proj.transform([461152.65, 5108327.47], 'EPSG:3765', 'EPSG:3857')
    }),
    target: 'js-map',
    layers: [
        new ol.layer.Tile({
            source: new ol.source.OSM()
        }),
        new ol.layer.Vector({
            source: new ol.source.Vector({
                url: 'test_1.geojson',
                format: new ol.format.GeoJSON({
                    dataProjection: 'EPSG:3765',
                    featureProjection: 'EPSG:3857'
                })
            })

        })
    ]
});

geojson 文件中的坐标以米为单位,如下所示:

"coordinates": [ [ [ 461117.98, 5108379.85 ], [ 461124.53, 5108368.39 ], [ 461132.37, 5108354.26 ], [ 461141.13, 5108341.08 ...

我成功渲染了geojson,但位置错误,如下所示: 在此处输入图像描述

我希望它在这里,像这样: 在此处输入图像描述

我做错了什么?它是geojson坐标格式的问题还是我需要以某种方式重新投影geojson以像第二张图片一样?

更新

从这里您可以下载 geojson 并测试您是否喜欢 https://www.dropbox.com/s/ih1bh8bj4zzgutc/test_1.geojson?dl=0

使用 pavlos 的示例,我编辑了几行,或者更准确地说;我正在尝试使用此代码块加载本地 geojson

var geojsonObject = $.ajax({
  dataType: "json",
  url: "test_1.geojson"
});

但我不断收到这种类型的错误:

Uncaught TypeError: (0 , Tm[a.type]) is not a function

代码如下:

proj4.defs(
    'EPSG:3765',
    '+proj=tmerc +lat_0=0 +lon_0=16.5 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs'
);

var geojsonObject = $.ajax({
    dataType: "json",
    url: "test_1.geojson"
  });
console.log(geojsonObject);

var styles = {
    'Polygon': new ol.style.Style({
        stroke: new ol.style.Stroke({
            color: 'red',
            width: 5
        }),
        fill: new ol.style.Fill({
            color: 'rgba(255, 0, 0, 1)'
        })
    })
};

var styleFunction = function(feature) {
    return styles[feature.getGeometry().getType()];
};



var vectorSource = new ol.source.Vector({
    features: (new ol.format.GeoJSON()).readFeatures(geojsonObject, {
        defaultDataProjection: ol.proj.get('EPSG:3765'),
        featureProjection: 'EPSG:3857'
    })
});
var vectorLayer = new ol.layer.Vector({
    source: vectorSource,
    style: styleFunction
});
var map = new ol.Map({
    layers: [
        new ol.layer.Tile({
            source: new ol.source.OSM()
        }),
        vectorLayer
    ],
    target: 'map',
    controls: ol.control.defaults({
        attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
            collapsible: false
        })
    }),
    view: new ol.View({
        center: ol.proj.transform([461117.98, 5108379.85], 'EPSG:3765', 'EPSG:3857'),
        zoom: 12
    })
});

更新 3

我相信我更近了一步但仍然没有运气

我用 jQuery 和 AJAX 请求编辑了一些代码,并在 loader 属性中设置了函数。现在代码看起来像这样:

var vectorLayer = new ol.layer.Vector({
    source: new ol.source.Vector({
        loader: function() {
            $.ajax({
                type: 'GET',
                url:'test_1.geojson',
                context: this
            }).done(function(data){
                var format = new ol.format.GeoJSON();
                this.addFeatures(format.readFeatures(data, {
                    defaultDataProjection: ol.proj.get('EPSG:3765'),
                    featureProjection: 'EPSG:3857'
                }));

            });
        }
    })
});
map.addLayer(vectorLayer);

但现在我看不到我的 GeoJSON 功能,它似乎已加载但未在地图上呈现。

我必须指出,如果我从 readFeatures 方法中评论这两行

defaultDataProjection: ol.proj.get('EPSG:3765'),
featureProjection: 'EPSG:3857'

geojson 确实渲染但在错误的位置,就像在第一张图片中一样。请帮忙..我真的没有更多的眼泪了..

4

2 回答 2

1

我认为您的问题出在坐标或源 EPSG 上。

查看https://epsg.io/3765,该投影的边界在意大利以东,而您希望您的几何图形在意大利以西。

使用该投影,x 坐标应该是负数。

我的猜测是您的 geojson 文件没有使用 EPSG:3765

于 2017-09-05T11:44:20.443 回答
1

我不确定您的问题是什么,但也许您的 geojson 文件不包含crs定义。也许 proj4js 版本不正确。

检查这个小提琴 - > https://jsfiddle.net/p_tsagkis/s9vtoaak/。我正在使用您的投影,并且似乎处于正确的位置。

更新:您还需要稍微更改一下 geojson 文件。投影的定义,应该如下:

{"type":"FeatureCollection",
"crs": {
          "type": "name",
          "properties": {
            "name": "EPSG:3765"
          }
        },
        "features":[..........

如果您无法编辑 geojson 文件,另一种选择是将 geojson 中存在的名称注册到 ol3 js 部分。像这样:

proj4.defs('urn:ogc:def:crs:EPSG::3765', proj4.defs('EPSG:3765'));

或将投影定义 js 行替换为:

proj4.defs("urn:ogc:def:crs:EPSG::3765","+proj=tmerc +lat_0=0 +lon_0=16.5 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs");

我还没有测试它,但它应该可以工作。

ol3 不知道urn:ogc:def:crs:EPSG::3765 你只是给proj4.defs("EPSG:3765","+proj=tmerc +lat_0=0 +lon_0=16.5 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs"); 了所以你需要让它知道文件中存在的投影名称。

于 2017-09-06T08:40:43.023 回答