模仿鼠标点击 - 融合表层上已知坐标的点 - 谷歌地图

时间:2013-10-26 11:27:31

标签: google-maps google-maps-api-3 google-fusion-tables

我一直在google maps使用融合表的图层制作脚本。

我正在使用地理编码器并获取我需要的点的坐标。

我使用google.maps.event.addListener(layer, "click", function(e) {});

放置了一个脚本,当您点击它时,会从融合表中更改多边形的样式

我想使用与点击图层时调用的功能相同的功能,但这次只需点击一下我得到的坐标。

我试过了google.maps.event.trigger(map, 'click', {latLng: new google.maps.LatLng(42.701487,26.772308)});

以及此处的示例> Google Fusion Table Double Click (dblClick)

我尝试用图层更改地图...

如果我的问题非常愚蠢,我很抱歉,但我尝试了很多选择。

P.S。我看过许多关于从表中获取信息的帖子,但我不需要。我想更改所选行中KML元素的样式,因此我不会通过查询看到它发生。

以下是我的剧本模型:

        function initialize() 
        {
        geocoder = new google.maps.Geocoder();

        map = new google.maps.Map(document.getElementById("map_canvas"),myOptions);

        layer = new google.maps.FusionTablesLayer({
            suppressInfoWindows:true,
            map : map,
                query : {
                    select: 'Местоположение',
                from: '12ZoroPjIfBR4J-XwM6Rex7LmfhzCDJc9_vyG5SM'
                }
            });

            google.maps.event.addListener(layer, "click", function(e) {
            SmeniStilRaionni(layer,e);
                marker.setMap(null);
            });

            }

    function SmeniStilRaionni(layer,e)
            {
                ...
            }

    function showAddress(address) 
        {
        geocoder.geocode( { 'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                  var point = results[0].geometry.location;
                  //IMITATE THE CLICK
                  }
            });
        }

回应 geocodezip

这样你隐藏了所有其他元素......我不希望如此。就像我想要更改所选元素的边框一样。我不希望有一个新的层。 在我现在使用的函数中,我按下style options的{​​{1}},然后设置选项。我在layer规则中插入e,使用google.maps.event.addListener(layer, "click", function(e));中的e.row['Name'].value

我想问一下where

中的e变量是否有任何信息

我发现了如何获得我想要的结果:

对于我的查询后,我得到了这一点:

google.maps.event.addListener(layer, "click", function(e));

然后我得到了这些结果:

var queryText ="SELECT 'Районен съд','Окръжен съд','Апелативен съд','Местоположение'  FROM "+FusionTableID+" WHERE ST_INTERSECTS(\'Местоположение\', CIRCLE(LATLNG(" + point.toUrlValue(6) + "),0.5));";
queryText = encodeURIComponent(queryText);          
document.getElementById("vij query").innerHTML = queryText;
var query = new google.visualization.Query('http://www.google.com/fusiontables/gvizdata?tq='  + queryText);

然后,我使用以下内容:

var rsyd = response.getDataTable().getValue(0,0);
var osyd =  response.getDataTable().getValue(0,1);
var apsyd = response.getDataTable().getValue(0,2);

与以下内容相同:

      where: "'Районен съд' = '"+rsyd+"'",
点击功能中的

这是解决我问题的有效方法。

但是,我找不到模仿鼠标点击的方法。

1 个答案:

答案 0 :(得分:0)

问题是:当您单击图层时,将通过AJAX请求图层的数据(行)。

理论上,可以通过给定的LatLng选择几何(多边形),几何库有一个方法:google.maps.geometry.poly.containsLocation()

不幸的是,FusionTableAPI不支持此类查询(ST_CONTAINS),您无法通过提供LatLng并选择几何包含LatLng的行来选择行。

那么你可以做什么:创建一个包含选择行所需列的表的副本(Община ...不同的值,Местоположение ....几何) 。可以通过AJAX请求此副本,但是当FusionTable不再被修改时,我建议使用硬编码副本。

当您想要模拟点击时该怎么办:

迭代副本的所有行,使用提到的containsLocation() - 方法检查几何(Местоположение)是否包含LatLng以及何时使用不同的值来应用查询专栏Община

当然,检查所有几何图形需要一些时间,但FusionTable不是很大,在您的情况下应该是一种可能的方法。

以下是演示:http://jsfiddle.net/doktormolle/sSwj3/

存储数据的大小约为500kb,您应该将数据存储在外部脚本中,以便缓存它们。

您可能会注意到,通过链接触发时,所选图层的高亮度会快得多,因为不会通过AJAX请求数据。如果您需要突出显示所选要素,则可以完全忽略对图层点击的观察,并观察地图点击。使用返回的LatLng从数据中检索选定的行并设置样式:

演示:http://jsfiddle.net/doktormolle/swdX8/