Другой результат при предоставлении URL и строки функций

Я использую Openlayers 4.6 и машинописный текст.

Когда я создаю простой векторный слой для визуализации простых черных точек на карте, я могу предоставить ему URL-адрес, например:

export interface Options {
    features: string;
    url: string;
    text: string;
    font: string;
    textBaseline: string;
    fillColor: string;
}
...
constructor(private options: Options) {
    const { features, url, text, font, textBaseline, fillColor } = this.options;
    const format = new ol.format.GeoJSON();
    this._layer = new ol.layer.Vector({
        source: new ol.source.Vector({
            format,
            url
        }),
        style: new ol.style.Style({
            text: new ol.style.Text({
                text,
                font,
                textBaseline,
                fill: new ol.style.Fill({
                    color: fillColor
                })
            })
        })
    });    
 ...

и он отлично работает:

Рабочий пример с предоставленным URL

Однако я хочу предоставить (те же) данные в формате простой строки, которые могут быть проанализированы до фактического объекта GeoJSON, например:

export interface Options {
    features: string;
    url: string;
    text: string;
    font: string;
    textBaseline: string;
    fillColor: string;
}
...
constructor(private options: Options) {
    const { features, url, text, font, textBaseline, fillColor } = this.options;
    const format = new ol.format.GeoJSON();
    this._layer = new ol.layer.Vector({
        source: new ol.source.Vector({
            features: new ol.format.GeoJSON().readFeatures(features)
        }),
        style: new ol.style.Style({
            text: new ol.style.Text({
                text,
                font,
                textBaseline,
                fill: new ol.style.Fill({
                    color: fillColor
                })
            })
        })
    });    
 ...

Строка, переданная в features, читается вызовом

private readTextFile(file: string): string {
    let rawFile = new XMLHttpRequest();
    let result: string = '';
    rawFile.open('GET', file, false);
    rawFile.onreadystatechange = () => {
        if (rawFile.readyState === 4) {
            if (rawFile.status === 200 || rawFile.status === 0) {
                result = rawFile.responseText;
            }
        }
    };
    rawFile.send(null);
    return result;
}

предоставление url в качестве параметра file.

Это работает должным образом. Пошаговое выполнение конструктора с помощью отладчика Chrome приводит к считыванию правильных данных в правильном формате и т. Д.

Что касается визуализации, карта выглядит так:

Неправильная визуализация со строковыми функциями

что явно неверно ... Уменьшив масштаб, можно увидеть точки прямо у берегов Африки. При повторном увеличении (очень большом!) Точки снова расходятся:

Визуализация точек у берегов Африки

Версия точек в увеличенном масштабе

Теперь я прочитал в нескольких сообщениях здесь, на SO и других форумах, что мне может понадобиться дать прогноз данных / функций. Итак, я попробовал:

export interface Options {
    features: string;
    url: string;
    text: string;
    font: string;
    textBaseline: string;
    fillColor: string;
}
...
constructor(private options: Options) {
    const { features, url, text, font, textBaseline, fillColor } = this.options;
    const format = new ol.format.GeoJSON();
    this._layer = new ol.layer.Vector({
        source: new ol.source.Vector({
            features: new ol.format.GeoJSON().readFeatures(features, {
                dataProjection: 'EPSG:3857',
                featureProjection: 'EPSG:3857'
            })
        }),
        style: new ol.style.Style({
            text: new ol.style.Text({
                text,
                font,
                textBaseline,
                fill: new ol.style.Fill({
                    color: fillColor
                })
            })
        })
    });    
 ...

Но результат остается прежним. Вид имеет такую ​​же проекцию.

Что мне здесь не хватает? Почему данные, которые вы предоставляете по URL-адресу, верны, а те же данные, предоставленные строкой, неверны?


person Do Re    schedule 28.03.2018    source источник


Ответы (1)


Данные представлены в широте и долготе, то есть EPSG 4326. Вам нужно указать вашему приложению, что оно будет читать в 4326 и отображать в 3857. Как и сейчас, вы заявляете, что данные уже находятся в 3857, поэтому все точки находятся в пределах + -180 м. (не градусы) координаты 0; 0.

Попробуйте изменить эту часть вашего кода:

features: new ol.format.GeoJSON().readFeatures(features, {
            dataProjection: 'EPSG:4326',
            featureProjection: 'EPSG:3857'
        })

Когда вы используете URL-адрес для получения данных, это изменение проекции между проекцией данных и проекцией просмотра обрабатывается OL, как описано в Vector.url doc.

person JGH    schedule 28.03.2018
comment
Теперь понятно, что оба, dataProjection и featureProjection являются обязательными в параметрах. Спасибо! - person Do Re; 28.03.2018