- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我将尝试创建一个 C# 库来将对象序列化为 GeoJSON使用 Json.NET (用于序列化)和 GeoAPI.NET (用于几何定义)。
我考虑过两种不同的序列化实现方法,但我不清楚哪一种是最好的方法。它们是:
方法 1 - 自定义属性
第一种方法涉及创建多个可应用于任何类以修改序列化的自定义属性。例如,一个类可能被装饰成这样:
[GeoJsonFeature]
public class Building
{
[GeoJsonId]
public Guid Id { get; set; }
[GeoJsonProperty]
public string Name { get; set; }
[GeoJsonProperty]
public int Floorcount { get; set; }
[GeoJsonGeometry]
public GeoAPI.Geometries.IGeometry Geometry { get; set; }
}
然后序列化对象就很简单了:
JsonNetResult jsonNetResult = new JsonNetResult();
jsonNetResult.Formatting = Formatting.Indented;
jsonNetResult.Data = building;
return jsonNetResult;
这种方法的优点是任何业务对象都可以转换为 GeoJSON 对象,前提是它具有所需的属性(例如 Geometry )。缺点是我需要创建一些自定义属性来支持序列化。此外,这会“混淆”业务对象。
最后,我还不确定这种方法是否适用于 JSON.NET,尽管它似乎是可行的。
方法 2 - 自定义 JsonConverter
第二种方法涉及为各种类型创建自定义转换器。例如,我可能有一个 GeoJsonConverter,当传递一个给定类型的对象时,比如 Feature,就会创建 GeoJSON 对象。这可能看起来像:
public class GeoJsonFeatureConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer)
{
// serializing code here
}
public override void ReadJson(JsonReader reader, Type objectType, JsonSerializer serializer)
{
// deserializing code here
}
public override bool CanConvert(Type objectType)
{
return typeof(Feature).IsAssignableFrom(objectType);
}
}
然后我就可以像这样序列化为 GeoJson:
JsonNetResult jsonNetResult = new JsonNetResult();
jsonNetResult.Formatting = Formatting.Indented;
jsonNetResult.SerializerSettings.Converters.Add(new GeoJsonFeatureConverter());
jsonNetResult.Data = building;
这里的优点是这看起来更容易创建。我已经通过一个非常简单的原型(prototype)证明了这种方法是可行的。此外,如果我链接到 NetTopologySuite,则已经定义了 Feature
类.
缺点是我的业务对象在序列化之前需要映射到 Feature
。不过,这可能被认为是一个优势,因为这可能会在层之间提供自然的解耦。在这两种情况下肯定会与 GeoAPI 紧密耦合,在后来的情况下会与 NetTopologySuite 紧密耦合。我想我可以接受。
我知道其他几个可用的 GeoJson 序列化程序,例如 GeoJson.NET但是我想要一种与 Json.NET API 一致的方法,因为这是我们选择的序列化程序。
您是否看到任何明显的原因可以说明为什么一种方法优于另一种方法?也许还有另一种我不知道的方法?
仅供引用,我倾向于第二种方法。看起来它会更容易实现,并且整体上会更干净。我也碰巧喜欢它会创建的域对象和 GeoJson 对象之间的自然边界。
最佳答案
我个人倾向于第一个选择,原因很简单。如果您查看 .NET 框架,就会发现在 System.Xml.Serialization 命名空间中有一个与您的序列化类似的东西。他们几乎完全按照您在第一种方法中的建议进行操作。
但是,如果您不是特别喜欢那样,我建议使用第三种方法:编写自定义序列化格式化程序,实现 System.Runtime.Serialization.IFormatter。这使您能够为您的对象(如 [Serializable] 和 ISerializable)使用标准序列化符号和机制,但您遵循公认的模式,使 use 易于识别。此外,作为额外的好处,您可以通过换掉 IFormatter 实现轻松地支持其他形式的序列化(二进制、肥皂、其他自定义格式)
编辑:这是一个例子:Link
关于c# - 有关如何使用 JSON.NET 创建自定义 GeoJson 序列化程序的建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1262380/
我正在尝试按照此链接 http://bost.ocks.org/mike/map/ 上的教程进行操作到目前为止,我已经完全按照列出的每条说明进行操作,但是当我尝试运行“#Converting Data
何我可以反转一个国家的 GeoJson,以便它将国家定义为世界地图多边形中的一个洞?我需要这个来在 OpenLayers 5.3 中创建 GeoJson VectorLayer 的蒙版。 最佳答案 在
我在构建 GeoJSON 并将其放在 map 上的传单代码方面遇到了一些麻烦。 GeoJSON 是根据服务的 XML 响应构建的。 错误是 无效的 GeoJSON 对象。 throw new Erro
我有一个 geojson 表示插值天气数据的等高线层。某些轮廓在更高的缩放级别消失,如以下屏幕抓图所示。 将多边形作为图层添加到 Mapbox 时,使用以下代码: map.addSource('min
我有一些地理边界 have a GeoJSON endpoint for . 我还有一些变量存储在单独的 GeoJSON endpoint 中它没有坐标,但确实有我想稍后使用 D3 对 map 进行主
我是 MapBox GL Js 的新手,我想通过 https 调用一个大的 GeoJSON 文件并将其显示到 map 上。 我认为调用 vector Tile 是最好的方法,我找到了一些教程,展示了如
我已经使用 SQL 到 geoJSON 生成了我的数据库的一些兴趣点。 地理数据: { "FeatureCollection" : [ { "g
创建一张与此处找到的 map 类似的 map : https://www.plantmaps.com/interactive-california-2012-usda-plant-zone-hardi
我对 ammCharts 比较陌生,这也是我第一次尝试创建 geoJSON 文件。 以下是我的geoJson文件: GeoJSON file 这就是我要实现的目标: example 当我加载我的 ge
我有几个 geojson 层,并且我使用组将其分层。我使用此处找到的 Mike 答案将 map 集中在给定的 geojson 文件上 -> Center a map in d3 given a geo
环回新手,但设置我的第一个基于节点的 RestAPI 很有趣。我能够创建模型并在数据存储中创建关联的表。我的模型需要具有数据类型 geojson 的属性,即以下形式的字符串: { “类型”:“特征”,
我使用传单构建了一个 map ,其中包含大的 GeoJSON 区域,这些区域由多个“较小”的 GeoJSON 区域组成。 我正在使用 Leaftet-Ajax 来这样调用它们: var Rennes
我已经能够让其中的一部分工作,但是当 properties.affectedZones 有多个条目时,我的 jQuery 失败了。我已经使用 .each 努力显示受到红旗警告的受影响区域,但是当有两个
我需要对从 geojson 文件中提取的每个功能进行不同的样式设置。然而,这个匿名样式函数仅更改它遇到的第一个功能的样式并停止。我是传单新手。看过几个演示,但找不到这个匿名样式函数仅更改第一个功能的样
我有多个 geojson 类型:存储在 Mysql 中的 FeatureCollection。我想将两个或多个 geojson 合并到一个 FeatureCollection geojson 中并显示
我有这个 geojson { "type":"FeatureCollection", "features":[ { "type":"Feature",
我正在尝试在基于标准 HelloWorld 示例应用程序的测试应用程序中加载以下 geoJson 文件。 { "type": "FeatureCollection", "generator":
我正在使用 GeoJSON 数据构建传单 map 。尝试根据 GeoJSON 属性设置我使用的图标时遇到问题。我认为我的错误与使用字符串调用对象有关,但我无法弄清楚它到底是什么。 这是我的代码: Ge
我有包含如下地理字段的文档。 "geo" : { "type" : "Point", "coordinates" : [ 37.44609999, -1
是否可以仅使用 JavaScript(通过 d3、topojson 或任何其他方式)确定给定纬度、经度的 GeoJSON 点是否位于给定 GeoJSON 多边形内? 例如,我可以根据教程 here 绘
我是一名优秀的程序员,十分优秀!