Google Maps API v3需要很长时间才能显示GeoRSS Feed中的更改

时间:2012-06-05 21:17:02

标签: google-maps rss kml georss

我需要在Google Maps API v3上显示GeoRSS Feed。此Feed通过以下过程创建:

  1. 用户输入关键字
  2. 感谢PHP代码,通过从3个不同的现有RSS源中获取包含关键字的新闻项来创建RSS文件。
  3. 此RSS文件的链接提供给Metacarta RSS地理标记服务(http://labs.metacarta.com/rss-geotagger/
  4. 获得的GeoRSS文件也必须转换为KML文件(如果我将链接指向GeoRSS作为KmlLayer函数的参数,Google Maps将只放大到海洋中)。为此,我正在使用GeoRSS到geonames.org的KML转换器
  5. 然后,生成的URL将作为KmlLayer函数的参数传递
  6. 在我第一次尝试时,一切正常。但是,当我输入新关键字时,Google地图会显示我尝试使用上一个关键字的标记。在显示新的KML图层之前花了将近15分钟(当然,在点击我的网络浏览器的“刷新”按钮之后)。有没有办法解决这个问题,以便在输入新关键字后立即在地图上显示修改后的GeoRSS Feed?

    由于新用户的超链接编号限制,我将在此处输入源代码。您可以从此处访问文件:http://denizseeu.comule.com/ 我正在使用的文件是:home.html,my_rss.php,rss.xml和map.html

    home.html - 用于输入和确认关键字的第一页

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Home</title>
        <style type="text/css">
            #keyword
            {
                color:grey;
                font: italic 12pt Arial;
            }
        </style>
    </head>
    <body>
        <form name ="form1" method ="POST" action = "my_rss.php">
            <input type="Text" onblur="if(this.value=='') { this.value='Enter keyword'; this.style.color='grey'; this.style.font='italic 12pt Arial'; }" onfocus="if(this.value=='Enter keyword') { this.value=''; this.style.color='#111111'; this.style.font='normal 12pt Arial'; }" value="Enter keyword" name="keyword" id="keyword">
            <input type="Submit" name="Submit1" value= "Show news on map" />
        </form>
    </body>
    </html>
    

    my_rss.php - 创建RSS文件的PHP文件

    <html>
    <head>
    <title>Redirecting...</title>
    <meta http-equiv="refresh" content="0;URL=map.html">
    </head>
    
    <body>
    <?php
        $keyword = $_POST['keyword'];
        $URL = array("http://www.nytimes.com/services/xml/rss/nyt/GlobalHome.xml","http://feeds.bbci.co.uk/news/world/rss.xml?edition=uk","http://rss.cnn.com/rss/edition.rss");
        $output = "
    <rss version=\"2.0\">
        <channel>
            <title>RSS collection</title>
                    ";
    for($y=0;$y<count($URL);$y++)
    {
        $rss[$y] = simplexml_load_file($URL[$y]);
    
        foreach ($rss[$y]->channel->item as $item) 
        {
                if(preg_match("/".$keyword."/",$item->title,$result))
                {                       
                    $output .= "
                                <item>
                                    <title>". $item->title ."</title>
                                    <description>". $item->description ."</description>
                                    <link>";
                    $link=$item->link;
                    $link = str_replace('&', '&amp;', $link);
                    $output .= $link ."</link>
                               </item>
                                ";
                }
        }
    }
    $output .= "</channel></rss>";
    
    header ('Content-type: text/html; charset=utf-8');
    
    echo $output; 
    
    $xml = "rss.xml";
    $file = fopen($xml, 'w') or die("can't open file");
    fwrite($file, $output);
    fclose($file);
    ?>
    </body>
    </html>
    

    map.html - 包含Google Maps API的网页

    <!DOCTYPE html>
    <html>
    <head>
      <title>Welcome to my GeoRSS map</title>
      <meta name="viewport"
        content="width=device-width, initial-scale=1.0, user-scalable=no">
      <meta charset="UTF-8">
      <style type="text/css">
        html, body, #map_canvas {
          margin: 0;
          padding: 0;
          height: 100%;
        }
      </style>
      <script type="text/javascript"
        src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
      <script type="text/javascript">
          var map;
          var initial_point = new google.maps.LatLng(42.02,20.97);
          function initialize() {
            var myOptions = {
            zoom: 2,
            center: initial_point,
            mapTypeId: google.maps.MapTypeId.ROADMAP
          };
          map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);
    
        var geoRSS = new google.maps.KmlLayer('http://ws.geonames.org/rssToGeoRSS?type=kml&feedUrl=http%3A%2F%2Flabs.metacarta.com%2Frss-geotagger%2Ftag%2F%3Furl%3Dhttp%253A%252F%252Fdenizseeu.comule.com%252Frss.xml');
        geoRSS.setMap(map);
      }
    
      google.maps.event.addDomListener(window, 'load', initialize);
    </script>
    </head>
    <body>
      <div id="map_canvas"></div>
    </body>
    </html>
    

1 个答案:

答案 0 :(得分:1)

KmlLayer缓存KML,重新加载显然相同的文件不会导致Google重新加载KML并刷新其图层区块。

将随机虚拟参数(可能基于时间或Math.random)添加到您的KML网址。这将确保Google每次获得一个新的网址,并且是在地图中获取正确数据的最佳机会。

注意:Google的KML处理是一个黑盒子。它可能不会被伪参数欺骗。