1

我需要构建一个带有地理映射的 Web 应用程序,该应用程序将在地图上显示图钉,数据来自我的 sql 2005 数据库。此 Intranet 应用程序将托管在我们的安全服务器上,无法访问任何外部资源,也无法使用任何外部 API。

在互联网上搜索后,我发现我可以使用 leaflet.js 和 mapbox 来处理这个问题,尽管我必须将所有文件移动到本地。我还需要使用 TileMill 创建自定义地图,然后将图块复制到我的应用程序中。我试图创建我的自定义地图,但我无法创建任何图层,因为它要求 csv 文件或 sqllite 的数据源,我需要从我的 sql 2005 数据库中传递数据。是否可以使用 tilemill 创建自定义地图并提供我自己的数据源?我会以正确的方式解决这个问题吗?有没有更好的方法来创建必须在本地访问的地理映射应用程序?谢谢

4

2 回答 2

1

Rob,我确信有更好的方法可以做到这一点,但这是我实现它的方式。

我即将为您提供的解决方案应该允许您向 Mapbox 地图添加标记(搜索“omnivore mapbox”以获取 Web 应用程序 CSV 导入等效于 TileMill 添加数据源功能),该地图可以通过您的 Web 应用程序访问并获取其数据从连接到 MS SQL 数据库的 GridView 生成的 CSV 文件。

我遇到了同样的问题,数据在 SQL 2008 中,我需要用它来创建地图。Mapbox 需要 CSV 或 POSTGRESQL 来显示图钉,但我在任何地方都没有设置 POSTGRESQL 服务器。这是我所做的:(请注意,我正在使用 C# 并创建一个 ASP NET Web 应用程序)

  • 创建一个空的 ASPX 页面,我们称之为 DataGridView.aspx
  • 添加一个网格视图
  • 将该 GridView 链接到您的 SQL 数据源
  • 创建一个按钮,将其命名为“刷新 CSV”
  • 双击它以自动为该按钮创建一个事件。

在该按钮的事件代码中,使用以下代码:

protected void Button1_Click(object sender, EventArgs e)
    {
        GridView1.AllowPaging = false;
        GridView1.DataBind();

        StringBuilder sb = new StringBuilder();
        for (int k = 0; k < GridView1.Columns.Count; k++)
        {
            if(k==0) // little trick to avoid comma at the end of the line
            {
                sb.Append(GridView1.Columns[k].HeaderText);
                continue;
            }

            //add separator 
            sb.Append(',' + GridView1.Columns[k].HeaderText);
        }
        //append new line 
        sb.Append("\r\n");
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {

            for (int k = 0; k < GridView1.Columns.Count ; k++)
            {
                if (k == 0) // little trick to avoid comma at the end of the line
                {
                    sb.Append(GridView1.Rows[i].Cells[k].Text);
                    continue;
                }

                //add separator 
                sb.Append(','+GridView1.Rows[i].Cells[k].Text );
            }
            //append new line 
            sb.Append("\r\n");

        }

        string a= string.Empty;
        StreamWriter yourStream = File.CreateText(Server.MapPath("~/CSVExport.csv"));
        a = sb.ToString()+"\r\n"; //formatting text based on poeition
        yourStream.Write(a);                        
        yourStream.Close();
     } 

不要忘记在 DataGridView.aspx.cs 文件的开头有这些

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Text;

在您的 Web 应用程序的根目录上,创建一个空文件,将其命名为“CSVExport.csv”。

这将保存格式为 CSV 的 GridView 数据。

现在,每次单击该按钮时,它都会更新您的 CSVExport.csv 文件。

要检查一切是否正确显示,请启动 TileMill 并运行(在本地调试运行)您的网站。

转到 [localhost:whateverthatportnumberis]/DataGridView.aspx

点击按钮。打开 CSVExport.csv 以检查您的文件是否已更新(您应该会看到 CSV 文件格式的数据。)

现在,在不停止本地网站测试的情况下,继续使用 TileMill [localhost:whateverthatportnumberis]/CSVExport.csv 中 CSV 文件的链接

如果您的 CSVExport.csv 文件格式正确,您应该会看到正在显示的标记。这应该回答您有关如何将数据从 SQL 获取到 Mapbox 可以使用的 CSV 格式的问题。当您说:“有没有更好的方法来创建必须在本地访问的地理映射应用程序?”时,您的问题在这里变得模棱两可。所以我要在这里停下来。

同样,我刚刚给您的解决方案应该允许您向 Mapbox 地图添加标记(搜索“omnivore mapbox”以获取 Web 应用程序 CSV 导入等效于 TileMill 添加数据源功能),可以通过您的 Web 应用程序访问并获取其数据从连接到 MS SQL 数据库的 GridView 生成的 CSV 文件。

于 2014-05-01T14:57:49.430 回答
0

一种方法是在 TileMill 中创建自定义地图,而不使用 SQL 2005 数据库中的数据,然后将其导出为 mbtiles 文件,然后您可以将其托管在 mapbox 上。

将此地图用作leaflet.js 中的基础层,并添加通过AJAX 从访问您的SQL 数据库的REST API 动态加载的标记。

于 2014-04-30T13:46:29.890 回答