Есть ли какой-нибудь автоматический способ обнаружить код epsg и файл proj4 в файл geojson в openlayers?

У меня есть проект для загрузки некоторых файлов geojson, а затем построения на карте openlayers. У меня все было хорошо с образцом файла из Блюменау/Санта-Катарины/Бразилии (город/штат/страна), но когда я загрузил новые файлы из городов Бразилии, они увидели смещение на карте.

Есть ли способ автоматически определить параметры proj4 и код epsg при загрузке файлов на мой сайт? Собственно, страница только загружает файлы и определяет их по новому имени, не изменяя данные. Когда я пытался загрузить данные по Санто-Андре/Сан-Паулу/Бразилия, они отображались в другом штате Бразилии, но в формате города Санто-Андре.

<link rel="stylesheet" href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.5.0/proj4.js"></script>

proj4.defs('EPSG:32722', '+proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ');
ol.proj.proj4.register(proj4);

{% load static %}

var suscetibilidadeDeslizamento = new ol.layer.Vector({
                                      source: new ol.source.Vector({
                                        format: new ol.format.GeoJSON({dataProjection: 'EPSG:32722'}),
                                        url: '{% static deslizamento %}'
                                      }),
                                      style: style,
                                      opacity: 0.3
                                    });
var map = new ol.Map({
                          target: 'map',
                          layers: [

                            new ol.layer.Tile({
                                source: new ol.source.OSM()
                              }),
                                    suscetibilidadeDeslizamento

                          ],
                          view: new ol.View({
                            center: ol.proj.fromLonLat([-49, -27]),
                            zoom: 5
                          })
                        });

Вот данные Блюменау. Данные: https://raw.githubusercontent.com/tiagoferneda/files/master/SuscetibilidadeInundacaoBlumenau.json Blumenau  данные

Вот данные Санто-Андре, нанесенные над городом Терра-Боа, далеко от правильного местоположения. Данные: https://raw.githubusercontent.com/tiagoferneda/files/master/SuscetibilidadeInundacaoSantoAndre.json Данные Санто-Андре


person tfm    schedule 14.07.2019    source источник
comment
Спецификация GeoJSON wiki.geojson.org/GeoJSON_draft_version_6 позволяет указывать CRS (что должны понимать OpenLayers) но эти примеры не включают один. Без этого вам нужно было бы знать зону UTM (или долготу, чтобы вы могли рассчитать зону) каждого города. Санто-Андре находится ровно в 6 градусах к востоку от Терра-Боа, то есть в зоне 23.   -  person Mike    schedule 15.07.2019


Ответы (1)


Попробуйте прочитать CRS вашего JSON, прежде чем создавать ol.layer.Vector, а затем добавить соответствующие параметры proj4.

Вы должны взглянуть на этот пример OpenLayers, где он загружается параметры proj4 динамически из EPSG.io

person manmorjim    schedule 16.07.2019
comment
В этом случае GeoJSON не указывает CRS. - person Mike; 16.07.2019
comment
@Mike О, ты прав, я пропустил это. В RFC указано, что координаты должны быть в WGS 84, но в данном случае в соответствии с данные кода Santo Andre должны быть в формате EPSG:32722. вы пытались загрузить данные в QGIS, указав этот CRS? Возможно, что-то не так с координатами. - person manmorjim; 16.07.2019
comment
Блюменау находится в зоне 22, и данные имеют формат EPSG:32722, но Санто-Андре находится в зоне 23, и данные имеют формат EPSG:32723, но обрабатывается как EPSG:32722 и отображается на 6 градусов к западу от того места, где он должен быть. Но что касается других городов, я не уверен, строго ли Бразилия соблюдает границы зоны UTM или, как в Испании, это делается по провинциям. - person Mike; 16.07.2019