我将尝试创建一个C#库,使用Json.NET(用于序列化)和GeoAPI.NET(用于几何定义)将对象序列化为GeoJSON.
我已经考虑过两种不同的序列化实现方法,我不清楚哪种方法是最好的方法.他们是:
方法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; }
}
Run Code Online (Sandbox Code Playgroud)
然后序列化对象就像下面这样简单:
JsonNetResult jsonNetResult = new JsonNetResult();
jsonNetResult.Formatting = Formatting.Indented;
jsonNetResult.Data = building;
return jsonNetResult;
Run Code Online (Sandbox Code Playgroud)
这种方法的优点是,任何业务对象都可以转换为GeoJSON对象,假设它具有所需的属性(例如,几何).缺点是我需要创建一些自定义属性来支持序列化.此外,这会影响业务对象的"混乱".
最后,我还没有确定这种方法是否可以使用JSON.NET,尽管它似乎是.
方法2 - 自定义JsonConverter
第二种方法涉及为各种类型创建自定义转换器.例如,我可能有一个GeoJsonConverter,当传递给定类型的对象,比如Feature时,会创建GeoJSON对象.这可能看起来像:
public class GeoJsonFeatureConverter
{
public override void WriteJson(JsonWriter writer, object …Run Code Online (Sandbox Code Playgroud) 我想用Leaflet绘制许多地理点.因此,我想使用HTML5画布来提高性能.我的数据是geoJSON.正如我在Leaflet的文档中看到的那样,不可能将地理位置绘制为画布.
var anotherGeojsonLayer = new L.GeoJSON(coorsField, {
pointToLayer: function (latlng){
return new L.Marker(latlng, {
icon: new BaseballIcon()
});
}
});
Run Code Online (Sandbox Code Playgroud)
我想我应该联系到这里:
pointToLayer:function(latlng){}
有人知道如何将我的latlng对象绘制为画布吗?
有了Leaflet Choropleth教程,我必须模拟特定地图区域的点击事件.例如:我必须有一个这样的函数clickOnMapItem(itemId)将点击由以下代码定义的地图区域
{"type":"Feature","id":"05","properties":{"name":"Arkansas","density":56.43},"geometry":{"type":"Polygon","coordinates":[...}
Run Code Online (Sandbox Code Playgroud)
其中"id":"05"是我需要点击的ID
我的其余代码如下例所示:
国家data.js:
var statesData = {"type":"FeatureCollection","features":[
{"type":"Feature","id":"01","properties":{"name":"Alabama","density":94.65},"geometry":{"type":"Polygon","coordinates":[[[-87.359 and so on
Run Code Online (Sandbox Code Playgroud)
HTML:
...标题无名
<!-- language:lang-html -->
<body>
<div id="map"></div>
<script src="dist/leaflet.js"></script>
<script type="text/javascript" src="us-states.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
var map = L.map('map').setView([37.8, -96], 4);
var cloudmade = L.tileLayer('http://{s}.tile.cloudmade.com/{key}/{styleId}/256/{z}/{x}/{y}.png', {
attribution: 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
key: 'BC9A493B41014CAABB98F0471D759707',
styleId: 22677
}).addTo(map);
// control that shows state info on hover
var info = L.control();
info.onAdd = function (map) …Run Code Online (Sandbox Code Playgroud) 我玩topojson玩得很开心,但看起来topojson.object在topojson的V1中是未定义的,在V0中支持它.有人可以解释我如何解决这个问题吗?我试图在格式为topojson的输入文件中为每个多边形绘制不同的路径元素.代码是:
d3.json("maTopo.json", function(error, ma) {
svg.selectAll(".subunit")
.data(topojson.object(ma, ma.objects.ma).geometries)
.enter().append("path")
.attr("class", function(d) { return "subunit " + d.id; })
.attr("d", path);
});
Run Code Online (Sandbox Code Playgroud) 是否有一些node.js或javascript的库,它提供了一个函数来检查坐标是否在geojson多边形中?
我正在尝试创建一个小的HTTP API,告诉我哪些多边形(代表国家,县,城市等)包含给定的坐标.
我想我将在内存中保存所有多边形及其边界框的列表,然后首先检查每个多边形,如果它的边界框包含坐标.如果是,那么它将检查坐标是否在多面体本身.
我知道有一个名为"clipper"的库被移植到javascript,但似乎该库不提供简单的"pointInPolygon"函数,即使库本身非常强大.这个库仍然可以吗?
另外,我发现了另一个名为"geojson-js-utils"的库,但它似乎不支持多重多边形(至少它没有在那里提到)
我发现一些其他的库可以检查一个点是否在多边形中,但我不知道如何使用它们来检查一个点是否在多边形中.
任何提示?
我正在尝试显示横跨第180个子午线的geoJSON对象(在本例中为俄罗斯的轮廓).目前,这部分国家/地区位于地图左侧,部分位于右侧:

看看传单,似乎有一个修复,但似乎不起作用:https://github.com/Leaflet/Leaflet/issues/82.我也试过添加一个coordsToLatLng函数,但似乎无法让它工作.平铺图层有一个continuousWorld我认为不适用于geoJSON对象的选项.
此数据位于:https://dl.dropboxusercontent.com/u/12085570/RUS.json.数据从shapefile生成到geojson,最后生成到topojson.转换topojson我使用的--no-stitch-poles选项让它在地图上显示"很好",这意味着它不会将右边的点连接到地图的左侧.
有没有办法让它显示为一个连续的对象而不会在子午线周围分裂?
我正在使用传单中的geojson数据.他们在http://leafletjs.com/examples/geojson.html的指南中写道,有两种方法可以将geojson数据添加到地图中:
"GeoJSON对象通过GeoJSON层添加到地图中.要创建它并将其添加到地图中,我们可以使用以下代码:"
L.geoJson(geojsonFeature).addTo(map);
Run Code Online (Sandbox Code Playgroud)
"或者,我们可以创建一个空的GeoJSON图层并将其分配给变量,以便我们以后可以为它添加更多功能."
var myLayer = L.geoJson().addTo(map);
myLayer.addData(geojsonFeature);
Run Code Online (Sandbox Code Playgroud)
我目前正在使用最后一个方法(我正在创建一个空图层并向其中添加数据).我现在正在做的是我正在尝试添加onEachFeature函数.虽然我在使用myLayer.addData方法时没有让它工作.
在我的代码我正在使用this.geoJson.addData(geoJson, { onEachFeature: onEachFeature });.其中geoJson是实际的geoJson字符串,"this.geoJson"是已创建并添加到地图的空geoJson图层.虽然这不起作用.
但是如果我在输入geoJson数据的同时创建一个新的geoJson图层,那么它的工作原理如下:
L.geoJson(geoJson, {
onEachFeature: onEachFeature
}).addTo(this.map);
Run Code Online (Sandbox Code Playgroud)
所以我主要想知道在使用layer.addData函数添加数据时如何使onEachFeature函数工作?
我有困难装载包含GIS数据如下JSON(https://data.cityofnewyork.us/resource/5rqd-h5ci.json)成GeoDataFrame.
我尝试设置几何时,以下代码失败.
import requests
import geopandas as gpd
data = requests.get("https://data.cityofnewyork.us/resource/5rqd-h5ci.json")
gdf = gpd.GeoDataFrame(data.json())
gdf = gdf.set_geometry('the_geom')
gdf.head()
Run Code Online (Sandbox Code Playgroud) 我目前正在使用Android Google地图实用程序库.我通过API调用接收给定区域的geojson,并且需要在地图上显示该区域.
我打电话来这样做
GeoJsonLayer layer = new GeoJsonLayer(getMap(), geoJsonData);
layer.addLayerToMap()
Run Code Online (Sandbox Code Playgroud)
其中getMap()返回一个GoogleMap对象,geoJsonData是一个JSONObject.此代码在与geojson关联的区域周围绘制边框.
下面的代码在区域周围绘制一个红色边框,并用黄色填充.
GeoJsonLayer layer = new GeoJsonLayer(getMap(), geoJsonData);
GeoJsonPolygonStyle polygonStyle = layer.getDefaultPolygonStyle();
polygonStyle.setStrokeColor(ContextCompat.getColor(this, R.color.red));
polygonStyle.setFillColor(ContextCompat.getColor(this, R.color.yellow));
layer.addLayerToMap();
Run Code Online (Sandbox Code Playgroud)
我在设置这个GeoJsonLayer的样式时遇到了麻烦,整个地图是黄色的,区域的边框是红色,区域的填充颜色是正常颜色.
有人能告诉我如何使用GeoJson数据在Android中实现这一目标吗?一种选择是创建我自己的多边形形状.我可以使用覆盖整个地图的坐标声明一个多边形,然后使用geojson返回的坐标添加一个洞.
但我认为必须有一些更简单的东西允许我使用内置的GeoJsonLayer类,并且不需要我自己解析geojson.
我有MongoDB的以下问题.我从我的祖国获得了一些地理数据,我必须将它们存储到mongodb中以建立一个简单的Web要素服务.此服务主要使用$within运算符进行边界框查询.数据采用GeoJSON格式.因此我首先导入了[1,2]以这种格式表示为points()的村庄和城市.没问题.下一步是LineStrings的河流和街道,根据GeoJSON代表这种方式[[1,2],[3,4]].但是当导入区域(实际上是多边形并且根据GeoJSON规范3 dim arrrays)时,我geo values have to be numbers在创建索引时遇到了错误 .
db.collection.ensureIndex({"geometry.coordinates" : "2d"});
Run Code Online (Sandbox Code Playgroud)
所有数据都是有效的GeoJSON,并且在EPSG中的普通2d坐标:4326投影.
有人有想法吗?