博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
地图坐标助手-开发总结
阅读量:4360 次
发布时间:2019-06-07

本文共 4615 字,大约阅读时间需要 15 分钟。

  背景:

  一个旅游网站收集当地的加油站信息,并在网站上通过地图标注。需要知道该加油站的坐标、名称。在地图网站手动搜索粘贴复制工作量比较大,就需要用个软件自动将搜索结果导出为xls或者xml格式的文件。

  软件需求:

 1.旅游网站采用51地图显示加油站等类型的显示地图,用51地图(互联网不同地图网站坐标系是不同的,估计是为了防止大浦洞导弹),因此数据源采用51地图。

 2.wpf开发很久没碰了,时间要求紧,因此直接用asp.net写。

 3.npoi从来没用过,因此考虑导出为xls。

 4.需要将多个城市的搜索结果统一到一个表中导出(仅支持每次搜索一个城市的关键词,见”地图服务->关键词搜索“)。

 5.尽量用js完成功能,方便之后移植到wpf。

  软件截图:

 1.搜索框中输入搜索类型

 2.搜索框旁边的按钮点击之后出现一个用fancybox做的弹窗,输入城市名称,用空格隔开。

 3.搜索后左侧显示搜索结果,用jPages做个分页,右侧显示每一页的点(考虑到要搜索全西藏的加油站,因此用小比例尺)。点击列表中每一个点的按钮,可以地图放大到该点。暂时还没有把点删除功能加上。

 4.搜索之后用ajax自动生成xml,存在tempXml文件夹下。

 5.点击"生成xml"按钮,下载该xml表。

 

 经验总结-JSON处理

 1.地图搜索结果用一个自定义类型表示,将数据存储在一个数组中,在ajax调用时,将搜索结果用json传到后台。

function Coord(x, y, name,city) {    this.x = x;     //X坐标    this.y = y;    //Y坐标    this.name = name;  //加油站名称    this.city = city;        //所在城市名称}

 

 2.将数组转换成JSON格式的函数

//我想生成的JSON格式为//{"data":[{"x":111,"y":222,"name":"加油站1","city":“城市1”}, //         {"x":112,"y":223,"name":"加油站2","city":“城市1”}, ////                                   .... ////         {"x":113,"y":224,"name":"加油站1","city":“城市2”} //         ]}//数组转JSON字符串function ArrToJson(arr) {    var i,jsonstr;    jsonstr = "{\"data\":[";    for (i = 0; i < arr.length; i++) {        jsonstr += "{\"x\"" + ":" + "\"" + arr[i].x + "\",";        jsonstr += "\"y\"" + ":" + "\"" + arr[i].y + "\",";        jsonstr += "\"name\"" + ":" + "\"" + arr[i].name + "\",";        jsonstr += "\"city\"" + ":" + "\"" + arr[i].city + "\"},";    }    jsonstr = jsonstr.substring(0, jsonstr.lastIndexOf(','));    jsonstr += "]}";    return jsonstr;

 

 3.调用jquery的$.ajax方法。这里需要注意几个细节:

var p = ArrToJson(arrPoi);    var p2 = eval('('+p+')');    $.ajax({        url: '/bll/WriteXml.ashx',        type:'post',        //contentType: "application/json;charset:utf-8;",        dataType: 'json',        //data:p2,        data: { data: p, type: Words },        success: function () {        }    });

 网上看到用eval('('+value+')');把json格式的字符串转为object,再传值,但是我无论如何也失败了,所以干脆用字符串传递。还有个问题就是contentType若为application/json的话,也无法在后台获取到参数。我考虑了几种组合排除,比如用eval先转为objec后,contentType用application/json;或者contentType用application/json,参数用JSON字符串;或者data直接写为“data:p”或“data:P2”。都没有成功,原因始终没有弄明白。

 

 4.后台获取到参数后,将json格式的字符串解读。

using Newtonsoft.Json;using Newtonsoft.Json.Linq;using Newtonsoft.Json.Utilities;        ///         /// JSON转换        ///         ///         /// 
public static List
TransJson(string json) { JObject jo = JObject.Parse(json); List
data = jo["data"].Children
().ToList(); List
xCoord = data.Values
("x").ToList(); List
yCoord = data.Values
("y").ToList(); List
name = data.Values
("name").ToList(); List
city = data.Values
("city").ToList(); List
Coords = new List
(); for (int i = 0; i < xCoord.Count; i++) { Coords coord = new Coords(); coord.X = xCoord[i]; coord.Y = yCoord[i]; coord.name = name[i]; coord.city = city[i]; Coords.Add(coord); } return Coords; }

 这里使用的是newtonsoft.json库,在.NET3.5之后,加入了linq的支持。说实话用jsonConvert没搞明白,看了自带的DEMO之后,觉得如果是将JSON格式翻译,用linq最直观,数据操作也好弄;如果是在后台要把数组或者其他数据类型转为JSON格式的话,用JavaScriptConvert.SerializeObject最方便,一句话搞定。

 

经验总结-文件上传下载

1.文件上传

 后台就不说了,主要说说ajax传文件的问题。之前用$.ajax传文件总是失败,后来查了下才知道ajax是无法传输文件的,必须在页面中加一个隐藏的frame然后响应该frame里面的方法(大概思路)。这么弄挺麻烦的,幸好有现成的插件,jquery form(),用它的.ajaxSubmit方法

 

//点击按钮后响应该事件//上传文件function upLoadFIle() {    $('#FileForm').ajaxSubmit({        url: '/bll/ReadExcel.ashx',        success: function (data) {            alert(data);        }    });}

2.文件下载

 弄了半天没弄出来,总结出一句话来,ajax没法文件下载!

string fileName=Session["fileName"].ToString();            string virPath = Session["filePath"].ToString();            //以文件的形式下载文件            string phyPath = Server.MapPath(virPath);//路径            FileInfo fi = new FileInfo(phyPath);            Response.Clear();            Response.ContentType = "application/ms-download";            //context.Response.ContentType = "application/octet-stream";            Response.AddHeader("Content-Type", "application/octet-stream");            //context.Response.AddHeader("Content-Transfer-Encoding", "binary");            Response.Charset = "utf-8";            //context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");            //通知浏览器下载文件而不是打开            Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName + ".xml"));            Response.WriteFile(fi.FullName);            Response.Flush();            Response.End();

 

 

 

转载于:https://www.cnblogs.com/matoo/archive/2012/11/29/2794239.html

你可能感兴趣的文章
FastJson
查看>>
excel4j
查看>>
Thread
查看>>
char * 与char []探究理解
查看>>
QT窗体显示在屏幕中间位置
查看>>
emmet使用技巧
查看>>
RPC-Thrift(二)
查看>>
MSSQL for Linux 安装指南
查看>>
【Golang 接口自动化08】使用标准库httptest完成HTTP请求的Mock测试
查看>>
前端必读:浏览器内部工作原理
查看>>
Uri、URL和URN三者的区别
查看>>
数据字典的转换
查看>>
关于动态添加iview admin路由以及刷新侧边栏
查看>>
ApplicationInsights的探测器尝鲜
查看>>
java 解析Json格式数据
查看>>
unix中的线程池技术详解
查看>>
CSS简介
查看>>
常用三大软件评价1
查看>>
MVC各层介绍使用---初步理解
查看>>
单例对象的创建与销毁
查看>>