Размещение и загрузка файла KML в проекте Flex (IGN)

Я просматриваю учебник по отображению меток с использованием файла KML в гибком приложении. Я использую 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 на разных хостах, но это не изменилось. У вас есть ключ?

Спасибо.


person Lithium    schedule 23.07.2010    source источник


Ответы (1)


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

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

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

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

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

private var _request: XMLRequest = null;

to

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;
    }

}

}

person Sergiu    schedule 23.05.2011