Разместите и загрузите файл KML в проект Flex (IGN) - PullRequest
2 голосов
/ 23 июля 2010

Я смотрю учебник по отображению меток с помощью файла KML в приложении Flex.Я использую IGN API (openscales) в проекте flex.

Пример отлично работает (http://openscales.org/userguide/examples/srcview/source/KMLExample.mxml.

<os:KML url="http://www.parisavelo.net/velib.kml"
                proxy="http://openscales.org/proxy.php?url="
                numZoomLevels="20"
                style="{Style.getDefaultCircleStyle()}"/>

Но когда я размещаю тот же файл kml на моем сервере, какчто:

<os:KML url="http://www.cycom.org/velib.kml"
                proxy="http://openscales.org/proxy.php?url="
                numZoomLevels="20"
                style="{Style.getDefaultCircleStyle()}"/>

Метки не отображаются на карте. Я пытался разместить файл kml на разных хостах, но это не изменится. У вас есть подсказка?

Спасибо.

1 Ответ

1 голос
/ 23 мая 2011

Вам необходимо добавить файл crossdomain.xml на стороне сервера (в корневой папке), чтобы приложение могло получить доступ к вашему файлу KML.Например, если вы хотите разрешить доступ к вашему серверу для всех IP-адресов и доменных имен, просто используйте простой подстановочный знак, как показано ниже в файле crossdomain.xml:

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" />
</cross-domain-policy>

Для получения дополнительной информации об использовании файла crossdomain см.: Передача данных между доменами с использованием crossdomain.xml

Если у вас нет доступа к серверу или если это решение не работает для вас, вам нужно изменить KML.asкласс в openscales (находится в пакете org.openscales.core.layer).

Изменить строку 19

private var _request: XMLRequest = null;

на

private var _request :URLLoader = null;

Вот весь измененный KMLкласс:

package org.openscales.core.layer

{
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;

import org.openscales.core.Trace;
import org.openscales.core.feature.Feature;
import org.openscales.core.format.KMLFormat;
import org.openscales.core.request.XMLRequest;
import org.openscales.geometry.basetypes.Bounds;


public class KML extends FeatureLayer
{
    private var _url :String = "";
    private var _request :URLLoader = null;
    private var _kmlFormat :KMLFormat = null;
    private var _xml :XML = null;

    public function KML ( name :String,
        url :String,
        bounds :Bounds = null )
    {
        this._url = url;
        this.maxExtent = bounds;

        super( name );
        this._kmlFormat = new KMLFormat();
    }

    override public function destroy () :void
    {
        if ( this._request )
            this._request = null;

        this.loading = false;
        super.destroy();
    }

    override public function redraw ( fullRedraw :Boolean = true ) :void
    {
        if ( !displayed )
        {
            this.clear();
            return;
        }

        if ( !this._request )
        {
            this.loading = true;
            this._request = new URLLoader();
            this._request.addEventListener( Event.COMPLETE, onSuccess );
            this._request.addEventListener( IOErrorEvent.IO_ERROR, onFailure );
            this._request.load( new URLRequest( url ));
        }
        else
        {
            this.clear();
            this.draw();
        }
    }

    public function onSuccess ( event :Event ) :void
    {
        this.loading = false;
        var loader :URLLoader = event.target as URLLoader;

        // To avoid errors if the server is dead
        try
        {
            this._xml = new XML( loader.data );

            if ( this.map.baseLayer.projection != null && this.projection != null && this.projection.srsCode != this.map.baseLayer.projection.srsCode )
            {
                this._kmlFormat.externalProj = this.projection;
                this._kmlFormat.internalProj = this.map.baseLayer.projection;
            }
            this._kmlFormat.proxy = this.proxy;
            var features :Vector.<Feature> = this._kmlFormat.read( this._xml ) as Vector.<Feature>;
            this.addFeatures( features );

            this.clear();
            this.draw();
        }
        catch ( error :Error )
        {
            Trace.error( error.message );
        }
    }

    protected function onFailure ( event :Event ) :void
    {
        this.loading = false;
        Trace.error( "Error when loading kml " + this._url );
    }

    public function get url () :String
    {
        return this._url;
    }

    public function set url ( value :String ) :void
    {
        this._url = value;
    }

    override public function getURL ( bounds :Bounds ) :String
    {
        return this._url;
    }

}

}

...