美文网首页GeoLeaning
C#解析GEOJSON数据

C#解析GEOJSON数据

作者: 放翁lcf | 来源:发表于2018-05-08 16:52 被阅读516次

之前的一篇文章里介绍了geojson的标准格式,这里介绍一下用C#的Newtonsoft.Json库对一个geojson文件进行解析,因为Python的json库解析json还是非常容易的,用json.load或json.loads就可以读入json数据然后按照字典或列表的方式进行定位和更改其中的内容,因为最近一个 项目需要用C#进行解析,这里做一个记录。

下载与安装Newtonsoft.Json

首先在官网下载Newtonsoft.Json。官网上号称:

Popular high-performance JSON framework for .NET

当然确实还是很好用的,提供的接口还是挺友好的,开始入手可能有一些小困难。这个库的功能主要有3大块,分别为序列化json(将文本保存的json解析为可查询的json)、反序列化json和用LINQ对json进行查询。

在官网上可以点击Download下载压缩文件然后在自己的工程的解决方案管理器里添加引用,找到Newtonsoft.Json.dll文件然后引用。还有一个更快捷的方式是使用程序包管理器控制台进行安装,过程如下图:

Newtonsoft.Json的安装
先打开程序包管理器控制台,然后输入Install-Package Newtonsoft.json 进行安装。

安装好后在项目里记得添上using Newtonsoft.Json;这条语句。
这个库提供的数据类型有JObject、JProperty以及最基本的JToken。

读入json数据

下面是读入json并序列化到一个JObject对象的过程

StreamReader sr = new StreamReader(inputFile, Encoding.UTF8);
JObject o = JObject.Parse(sr.ReadToEnd());

如果输入文件inputFile不是标准的json格式可能会引发JsonReaderException异常。

索引对应数据

例如下面的geojson数据:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {"NAME": "hanzghou poi", "id": 1, "prov": " zhejiang"},
      "geometry": {
        "type": "Point",
        "coordinates": [
          120.07850646972656,
          30.304428412161137
        ]
      }
    }
  ]
}
该数据的效果

我们用前面的两句代码读入后,可以用JToken jprop=o["type"]索引到文本FeatureCollection,JToken可以对应各种类型的数据,并且保存着原来json的结构,可以在向下索引或者回溯到父节点。而JToken jfts = o["features"]已知内容是一个数组,可以用List<JToken> jlst = jfts.ToList();对里面的元素进行枚举,

List<JToken> jlst = jfts.ToList();
for (int i = 0; i < j jlst.Count; i++){
    //do sth
}

对于json的在大括号里的键值对(一般称为字典格式)数据,可以通过类似 o["features"] 的方式,将键放在中括号里进行索引,可以多级索引并保存为数值类型或者文本类型(需要一个隐式转换的语句)而不限于JToken进行保存,例如:string jtw = (string)jlst[i]["geometry"]["type"];,如果想要提取键怎么办呢?JToken没有获取键的接口,这个我摸索了一段时间,可以通过JProperty类型来解决,JProperty 有Name接口可以获取相应的Name;

JToken gprop = jlst[i]["properties"];
JProperty jpeo = (JProperty)gprop.ElementAt(0);
string usingStr=jpeo.Name;

geojson数据写入csv

下面是一个提取geojson的点数据到csv和根据csv写一个geojson文件的小示例,包含了从0开始写一个geojson文件的过程。

        /// <summary>
        /// geojson转csv,只对点要素有效
        /// </summary>
        private void geojsonToCsvPoi () {
            //其他要素不管,如果没有点要素,生成为空
            StreamReader sr = new StreamReader(inputFile, Encoding.UTF8);
            JObject o = JObject.Parse(sr.ReadToEnd());

            JToken jfts = o["features"];

            List<JToken> jlst = jfts.ToList<JToken>();
            int jlen = jlst.Count;

            StreamWriter csvWter = new StreamWriter(outputFile);
            for (int i = 0; i < jlen; i++) {
                string jt1 = (string)jlst[i]["geometry"]["type"];
                if (jt1 == "Point") {
                    try {
                        Array poiArr = jlst[i]["geometry"]["coordinates"].ToArray();
                        csvWter.WriteLine(coordPoint(poiArr));
                        infoLabel.Text = "geojson to csv 转换完成";//逻辑上不是,但为了不覆盖catch的内容,写在了这里
                    }
                    catch (Exception exp) {
                        infoLabel.Text = exp.Message;
                    }
                }else { //
                }
            }
            csvWter.Close();
            
        }

        /// <summary>
        /// csv转geojson的点数据
        /// </summary>
        private void csvPoiToGeojson () {
            try {
                StreamReader csvRder = new StreamReader(inputFile,Encoding.UTF8);
                string csvall = csvRder.ReadToEnd();//读入csv文件
                string[] csvlst = csvall.Split('\n');
                List<JObject> jfeslst = new List<JObject>();
                for (int j = 0; j < csvlst.Length; j++) {
                    if (csvlst[j] == "" && j == 0) {
                        infoLabel.Text = "输入csv文件为空,请确认输入文件后重试";
                        return; //如果是空文件
                    }
                    if (csvlst[j] != "") {//排除空行
                        double[] dlst = stringPoiToDList(csvlst[j]);
                        if (dlst.Length == 5 && dlst[0] == 0d)
                            return;
                        JProperty jcoord = new JProperty("coordinates",dlst);
                        JProperty jtpoi = new JProperty("type", "Point");

                        JProperty jgomtry =new JProperty("geometry", new JObject(jtpoi, jcoord));
                        JProperty jprots = new JProperty("properties",new JObject());
                        JObject jtfea = new JObject(new JProperty("type", "Feature"),jprots,jgomtry);
                        jfeslst.Add(jtfea);
                    }
                }
                JProperty jfs = new JProperty("features", jfeslst);

                JObject jcsv = new JObject(new JProperty("type", "FeatureCollection"), jfs);
                File.WriteAllText(outputFile, jcsv.ToString());
                infoLabel.Text = "csv 转geojson完成!";
            }
            catch( Exception expt) {
                infoLabel.Text = expt.Message;
            }
        }


Newtonsoft.Json可以很优秀地处理json格式的数据,也可以将其他类型的数据(例如kml)解析为json,本文主要讲了这个库处理geojson数据的一些方式。
如果您有其他解析需求没能在本文中找到答案,可以在其官方文档查看相应方法或函数的使用。

相关文章

  • C#解析GEOJSON数据

    之前的一篇文章里介绍了geojson的标准格式,这里介绍一下用C#的Newtonsoft.Json库对一个geoj...

  • Openlayers API-GeoJSON

    GeoJSON用于读取和写入geojson文件,可以通过加载文件的方式,将文件解析后,直接将数据加载到图层上,Ge...

  • geotools的multipolygon数据脱密

    脱密思路:以geojson形式获取postgis的数据,并将geojson数据通过geotools转换为multi...

  • shp与geojson格式互转

    ogr2ogr实现geojson格式数据转换成shp格式的数据 效果: 注意点:geojson转shp过程中,ge...

  • d3地图

    GeoJSON 是一种对地理数据结构进行编码的格式。http://geojson.org/官网 TopoJSON ...

  • 12-D3.js地图

    一、JSON与GeoJSON GeoJSON 是基于 JSON 的、 为 Web 应用而编码地理数据的一个标准。实...

  • GeoJson格式说明

    GeoJSON是基于JavaScript 对象表示法的地理空间信息数据交换格式。 一、简介 GeoJSON是一种对...

  • geojson数据来源

    最近在改客户数据地图,发现echarts已经不提供geojson数据的下载了,在百度上搜索下载的各种数据都不规范,...

  • awesome geojson

    awesome geojson awesome geojson GeoJSON utilities that wi...

  • Geojson笔记一:深度入门

    Geojson笔记一:深度入门 简介 Geojson是一个很重要的数据格式,结构清晰,表达简洁。 与ESRI的sh...

网友评论

    本文标题:C#解析GEOJSON数据

    本文链接:https://www.haomeiwen.com/subject/fchwrftx.html