Вам необходимо добавить файл 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;
}
}
}