ASP:使用新坐标动态更新谷歌地图引擎实例

ASP: Dynamically update a Google Maps engine instance with new coordinates

本文关键字:动态 更新 谷歌地图 实例 引擎 坐标 新坐标 ASP      更新时间:2023-09-26

如果这没有意义,请原谅我,我不能100%确定如何提问,所以我正在尽最大努力,并将经常更新这篇文章,以反映人们对我澄清问题的任何建议。

我有一个ASP页面,它通过一个在页面加载时运行的脚本调用Google地图引擎API(只是在页面本身中声明,而不是在PageLoad方法中声明)。由于不太了解JS或Maps API,我只是按照谷歌的指示将其嵌入页面并将坐标传递给它作为标记。我最终需要做的是,当它跟踪的对象改变位置时,能够将更新的坐标输入其中,这样页面上的地图就会显示标记"实时"移动(5秒刷新)。坐标在SQL表中更新,我有一个数据源在5秒的计时器上提取它们,所以我实际上在页面上有数据,但我不知道如何在发生这种情况时更新Maps实例,因为目前它只有硬编码的坐标。

因此,我的问题是,用这些不断变化的坐标更新"地图"实例的最佳方法是什么?有没有办法用新的坐标重新运行那个脚本?或者这应该以某种方式涉及更新面板吗?我是不是完全错了?我不想刷新整个页面,因为这会影响性能和用户体验。

作为参考,我的页面包含这样的内容:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
    </Triggers>
    <ContentTemplate>
        <asp:Label ID="Label2" runat="server" Text="Panel1 not refreshed yet"></asp:Label>
        <asp:RadioButtonList ID="RadioButtonList1" runat="server" DataSourceID="SqlDataSource1" DataTextField="mac" DataValueField="mac" Height="28px" OnSelectedIndexChanged="RadioButtonList1_SelectedIndexChanged">
        </asp:RadioButtonList>
    </ContentTemplate>
</asp:UpdatePanel>
<script>
  // Some JS here that calls the map and adds the coordinate to it
</script>

更新面板处理一个数据源,并每隔5秒用该数据源的信息更新一个列表和标签。这个脚本主要来自谷歌自己的例子,即如何将地图嵌入到带有坐标标记的页面中。我认为我需要在面板中添加一些东西,以便在计时器计时时重新运行脚本,但由于不熟悉ASP,我不确定如何实现这一点。我尝试过一些简单的事情,比如把脚本粘贴在里面,但一旦它引用了任何Google API类,页面就会崩溃(大惊喜)。我觉得我离得太近了,但无法建立最后一个简单的联系。我习惯于使用C#应用程序,这些应用程序可以按照我的意愿运行循环,并将更新推送到我需要的表单的任何部分,但将此JS集成在中会让我感到困惑。希望这是有道理的,现在很晚了,我很累(:

更新:我已经获得了要加载的映射,方法是在页面头部下方的<script>元素中声明具有尽可能大的作用域的脚本(包含C#代码的所有其余部分),然后在Page_PreRender方法中引用ScriptManager.RegisterClientScriptBlock。这会在页面加载时很好地加载地图,但当计时器滴答作响时,它只会清空地图所在的Div。我尝试使用这个技巧让脚本在每次面板更新时执行(通过将按钮放在面板中并在RegisterClientScriptBlock方法中引用它),但所有这些似乎都会在每次出现勾选事件时重新注册脚本。如果我观察调试器,我可以看到每次注册脚本时,标头中都会慢慢填充对脚本的新引用。我想我已经非常接近解决这个问题了,但我需要帮助重新安排一下。作为参考,这就是PreRender代码现在的样子,"script"是包含脚本本身的字符串:

protected void Page_PreRender(object sender, EventArgs e)
{
    ScriptManager.RegisterClientScriptBlock(Button1, Button1.GetType(), "MapRefresh", script, true);
}

是的,您应该使用带有AsyncPostbackTrigger 的UpdatePanel

http://msdn.microsoft.com/pt-br/library/system.web.ui.asyncpostbacktrigger(v=vs.100).aspx

但是,正如您所说,将触发AsyncPostBackTrigger的控件将是一个5秒更新坐标的计时器。

我已经设法解决了这个问题,但不幸的是,我不得不找一位懂javascript的同事来做。他修改了调用映射并在其上放置标记的脚本,以运行一个循环,该循环检查数据源,并通过一个临时数组管理标记的添加/删除,该数组保存活动标记的位置,同时清除整个映射,然后将它们重写到它上,去掉数据源中不存在的标记。他不得不使用一种自我揭示的方法来实现这一点,只重复调用特定的函数,而不是整个脚本。