【问题标题】:Flash and Google Maps - Only Last Icon showingFlash 和 Google 地图 - 仅显示最后一个图标
【发布时间】:2011-02-21 16:28:58
【问题描述】:

我有一个使用 CS4 在 Flash 中的简单地图和地理编码示例

问题很简单 - 我可以从 google 搜索 api 中检索一个简短列表,但是当我尝试使用循环在地图上生成图标时,只显示最后一个图标。 (忽略房子图标,它是之前生成的)

我觉得我遗漏了一些东西,或者犯了一个愚蠢的 AS3 错误(比如把它当作 c# 对待)——甚至是一个愚蠢的以木换树的错误。问题出在代码的最后一行。

我已经添加了我所有的代码,以防万一其他人可以找到它的用途 - 天知道我花了很长时间才弄清楚这一点:)

它运行here

(另外,如果有人知道为什么图标在渲染时略微出现在错误的位置,但如果您移动地图会更正 - 请告诉我)

任何帮助都会很棒。

谢谢。 P

import com.google.maps.services.ClientGeocoder;
import com.google.maps.services.GeocodingEvent;
import com.google.maps.LatLng;
import com.google.maps.Map;
import com.google.maps.MapEvent;
import com.google.maps.MapType;
import com.google.maps.overlays.Marker;
import com.google.maps.overlays.MarkerOptions;
import com.google.maps.styles.FillStyle;
import com.google.maps.styles.StrokeStyle;
import com.google.maps.controls.*
import com.google.maps.overlays.*
import flash.display.Bitmap;
import flash.display.BitmapData;

import com.adobe.utils.StringUtil;
import be.boulevart.google.ajaxapi.search.GoogleSearchResult;
import be.boulevart.google.events.GoogleApiEvent;
import be.boulevart.google.ajaxapi.search.local.GoogleLocalSearch;
import be.boulevart.google.ajaxapi.search.local.data.GoogleLocalSearchItem;


var strZip:String = new String();
strZip="60661"; 

var strAddress:String = new String();
strAddress ="100 W. Jackson Blvd, chicago, IL 60661";


var IconArray:Array = new Array;
var SearchArray:Array = new Array;

/*--------------------------------------------------------------
// The returned search data gets placed into this array
---------------------------------------------------------------*/

var LocalInfo:Array = new Array();
var intCount:int = new int;

var intMapReady:int=0;

/*===================================================================================
  We load the map first and then get the search criteria - this will keep the order of
  operation clean.  The 
====================================================================================*/

var map:Map = new Map();

map.key = "ABQIAAAAHwSPp7Lhew456ffD6qa2WmxT_VwdLJEfmcCgytxKjcH1jLKkiihQtfC-  TbcwryvBQYhRwHWa8F_Gp9Q";

map.setSize(new Point(600, 550));
map.addEventListener(MapEvent.MAP_READY, onMapReady);

//Places the map on the page
this.addChild(map);
map.x=5;
map.y=5;


function onMapReady(event:Event):void 
{  
 //Center the map and place the house marker
 doGeocode();
}

/*==========================================================================
 Goecode to return the LAT and LONG for the specific address, center
 the map and add the house icon
===========================================================================*/

function doGeocode()
{
    var geocoder:ClientGeocoder = new ClientGeocoder();

    geocoder.addEventListener(GeocodingEvent.GEOCODING_SUCCESS,
    function(event:GeocodingEvent):void {

    var objPlacemarks:Array = event.response.placemarks;

    if (objPlacemarks.length > 0) 
    {
        map.setCenter(objPlacemarks[0].point, 14, MapType.NORMAL_MAP_TYPE);

        var request:URLRequest = new URLRequest("house.png"); 
        var imageLoader:Loader = new Loader(); 
        imageLoader.load(request); 

        var objMarkerOptions:MarkerOptions = new MarkerOptions();
        objMarkerOptions.icon=imageLoader;
        objMarkerOptions.icon.scaleX=.15;
        objMarkerOptions.icon.scaleY=.15;
        objMarkerOptions.iconAlignment = MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER;
        var objMarker:Marker = new Marker(objPlacemarks[0].point, objMarkerOptions); 
        map.addOverlay(objMarker);

        doLoadSearch()
    }
});

//Failure code - good practice, really
geocoder.addEventListener(GeocodingEvent.GEOCODING_FAILURE,
    function(event:GeocodingEvent):void {
    txtResult.appendText("Geocoding failed");
    });

    // generate geocode
    geocoder.geocode(strAddress);
}

/*===============================================================
   XML Loader - loads icon file and search text pair from xml file
=================================================================*/

function doLoadSearch()
{
    var xmlLoader:URLLoader = new URLLoader();
    var xmlData:XML = new XML(); 
    xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
    xmlLoader.load(new URLRequest("config.xml"));

    function LoadXML(e:Event):void
    {
        xmlData = new XML(e.target.data);
        RetrieveSearch();
    }

    function RetrieveSearch()
    {  
        //extract the MapData subset
        var xmlSearch = xmlData.MapData;

        // push this to an xml list object
        var xmlChildren:XMLList =  xmlSearch.children();

        //loop the list and extract the data into an
        //array of formatted search criteria

        for each (var Search:XML in xmlChildren) 
        {
            txtResult.appendText("Searching For: "+Search.Criteria+" Icon=" + Search.Icon+ "Zip=" + strZip +"\r\n\r\n");
            //retrieve search criteria
            loadLocalInfo(Search.Criteria,Search.Icon,strZip);

        }
    }
}

/*==================================================================================
Search Functionality - does a google API search and loads the lats and longs required 
to place the icons on the map  - THIS WILL NOT RUN LOCALLY
===================================================================================*/


function loadLocalInfo(strSearch,strIcon,strZip)
{
    var objLocal:GoogleLocalSearch=new GoogleLocalSearch()
    objLocal.search(strSearch+" "+strZip,0,"0,0","","")
    objLocal.addEventListener(GoogleApiEvent.LOCAL_SEARCH_RESULT,onSearchComplete)

    function onSearchComplete(e:GoogleApiEvent):void
    {

        var resulta:GoogleSearchResult=e.data as GoogleSearchResult;

        //------------------------------------------------
        // Load the icon for this particular search
        //------------------------------------------------

        var request:URLRequest = new URLRequest(strIcon); 
        var imageLoader:Loader = new Loader(); 
        imageLoader.load(request);         

        //-------------------------------------------------------------
        // For test purposes

        txtResult.appendText("Result Count for "+strSearch+" = "+e.data.results.length+"\r\n\r\n");

        for each (var result:GoogleLocalSearchItem in e.data.results as Array)
        {
            LocalInfo[intCount]=[String(result.title),strIcon,String(result.latitude),String(result.longitude)];

            //---------------------------------------
            // Pop the icon onto the map
            //---------------------------------------

            var objLatLng:LatLng = new LatLng(parseFloat(result.latitude), parseFloat(result.longitude)); 
            var objMarkerOptions:MarkerOptions = new MarkerOptions();
            objMarkerOptions.icon=imageLoader;   
            objMarkerOptions.hasShadow=false;
            objMarkerOptions.iconAlignment = MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER;
            var objMarker:Marker = new Marker(objLatLng, objMarkerOptions); 

            /**********************************************************
              *Everything* works to here - I have traced out execution 
              and all variables. It only works on the last item
              in the array :(
            ***********************************************************/

            map.addOverlay(objMarker);
        }

    }
}

【问题讨论】:

    标签: flash google-maps google-maps-markers geocode


    【解决方案1】:

    嗯 - 在盯着屏幕几个小时后,我开始取出属性,看看我得到了什么。

    我开始从 MarkerOptions 中删除图标 - 你瞧,我的地图上弹出了一堆通用标记 - 所以问题在于加载图标。

    所以我在循环中移动了 imageLoader 功能,如下所示,它起作用了。令人惊讶的是,睡个好觉和一桶茶会为你做些什么。

    转到下一个问题 - 使用坐标使搜索居中 - 是的。

    .....
    
        var request:URLRequest = new URLRequest(strIcon);  
    
        //------------------------------------------------------------- 
        // For test purposes 
    
        txtResult.appendText("Result Count for "+strSearch+" = "+e.data.results.length+"\r\n\r\n"); 
    
        for each (var result:GoogleLocalSearchItem in e.data.results as Array) 
        { 
            LocalInfo[intCount]=[String(result.title),strIcon,String(result.latitude),String(result.longitude)]; 
    
    
        var imageLoader:Loader = new Loader();  
        imageLoader.load(request);          
    
            //--------------------------------------- 
            // Pop the icon onto the map 
            //--------------------------------------- 
    
            var objLatLng:LatLng = new LatLng(parseFloat(result.latitude), parseFloat(result.longitude));  
            var objMarkerOptions:MarkerOptions = new MarkerOptions(); 
            objMarkerOptions.icon=imageLoader;    
            objMarkerOptions.hasShadow=false; 
            objMarkerOptions.iconAlignment = MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER; 
            var objMarker:Marker = new Marker(objLatLng, objMarkerOptions);  
    
            map.addOverlay(objMarker); 
        } 
    

    【讨论】:

      猜你喜欢
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多