【问题标题】:GeoJSON working with Mongoose/Mongodb in Node.jsGeoJSON 在 Node.js 中使用 Mongoose/Mongodb
【发布时间】:2016-06-03 07:03:30
【问题描述】:

我正在使用 Node.js、Express、Mongo、Mongoose 和 Mapbox api 构建一个带有 MEEN 堆栈的地图 Web 应用程序。

到目前为止,它令人兴奋。我要显示的数据是 shapefile 中的多边形,这些多边形具有与之关联的属性。

到目前为止,我已经成功地将数据加载到 Mongodb 并使用模式配置了 Mongoose 模型。在节点应用程序中,我可以访问数据但不能将其加载到地图 api 中。

我收到错误“未捕获的错误:无效的 GeoJSON 对象。”

通过在 devtools 控制台中检查对象,我可以看到几何记录是空白的。我认为这是由于架构中的错误配置造成的。

以下是来自 Mongodb 命令行的一条记录。出于隐私目的,我删除了几个元素。看起来和预期的一样:

    {
    "_id" : ObjectId("56c77259336aac299181a207"),
    "type" : "Feature",
    "properties" : {
        "TNRTPCD" : "P",
        "TNRSBTPCD" : "C",
        "PRCNTOWNER" : 100,
        "NTRTMSTMP" : "20140908161622",
        "TNRSBTPDSC" : "CLAIM",
        "TRMNTNTPDS" : null,
        "TAG_NUMBER" : null,
        "OBJECTID" : 40495,
        "NTRSRD" : "MTA_ONLINE",
        "NUM_OWNERS" : 1,
        "PROTECTED" : "N",
        "PDTSRD" : "MTA_ONLINE",
        "TNRTPDSCRP" : "Placer",
        "TNRNMBRD" : 1030842,
        "RVSNNMBR" : 0,
        "FCODE" : null,
        "TRMNTNDT" : null,
        "RNHCTRS" : 20.3496,
        "TTLTPCD" : "PCX"
    },
    "geometry" : {
        "type" : "Polygon",
        "coordinates" : [
            [
                [
                    -121.88883540217063,
                    50.97489195799901,
                    0
                ],
                [
                    -121.88883523174192,
                    50.97072525131302,
                    0
                ],
                [
                    -121.8950854466247,
                    50.97072527980969,
                    0
                ],
                [
                    -121.89508560169767,
                    50.97489198254216,
                    0
                ],
                [
                    -121.88883540217063,
                    50.97489195799901,
                    0
                ]
            ]
        ]
    }
}

这是我的模型文件中的代码:

    //Claim Model

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

// Schema Defined Here
var claimSchema = new Schema({
  gid: Number,
  tnrtpcd: String,
  ttltpdsc: String,
  tnrsbtpcd: String,
  prcntowner: Number,
  ntrtmstmp: String,
  tnrsbtpdsc: String,
  owner_name: String,
  trmntntpds: String,
  tag_number: String,
  objectid: Number,
  gdtdt: String,
  ntrsrd: String,  
  claim_name: String,
  num_owners: Number,
  clientnum: Number,
  issue_date: String,
  protected: String,
  pdtsrd: String,
  pdttmstmp: String,
  tnrtpdscrp: String,
  tnrnmbrd: Number,
  rvsnnmbr: Number,
  fcode: String,
  trmntndt: String,
  rnhctrs: Number,
  ttltpcd: String,
  geometry: { type: [String], index: '2dsphere'}
}, { collection : 'docs' });

mongoose.model('Claim', claimSchema);

路由似乎在 app.js 中工作,因为我能够访问数据。这是我的视图文件中代码的相关部分:

script.
L.mapbox.accessToken = 'pk.[ommited]';

//- var geojson = mongoose.model('Claim').find({'properties.CLIENTNUM': 278107});
 var geojson = $.getJSON('/claims/nick',function(result){
        return result;
    });
L.mapbox.map('map', 'mapbox.outdoors')
  .featureLayer.setGeoJSON(geojson);

所以这里最大的问题是如何正确定义几何数据的架构?假设这是我的问题。

【问题讨论】:

  • 作为一个问题:这是服务器端呈现geojson数据还是客户端?

标签: node.js mongodb mongoose mapbox geojson


【解决方案1】:

看起来“类型”作为字段名称和“类型”作为猫鼬模式上的声明更加混乱。

要灵活地允许几个 GeoJSON 类型,您基本上希望您的“几何”字段是:

"geometry": {
    "type": { "type": String },
    "coodinates": []
}

如果需要,您可以为“点”、“多边形”等添加 enum,但通常是松散的“坐标”,因为数组 [] 在这些情况下符合规则。

稍微搜索一下应该会发现人们之前已经为此创建了“类型”。

【讨论】:

  • 我已将架构的几何部分更改为:geometry: { type: {type: String}, coordinates: []} }, { collection : 'docs' });我仍然收到一条错误消息,指出 geoJSON 对象无效。但我现在可以在 devtools 控制台中读取几何数据。我认为架构是正确的,或者至少更正确。我遇到了一个很酷的网站geojsonlint.com,它可以测试geoJSON 代码。该网站告诉我,我的 ID 条目无效。直接来自我的数据库的 ID 是:"_id" : ObjectId("56ca94e0336aac299182442f") 还有其他人遇到过这个问题吗?
【解决方案2】:

好的,现在解决了。感谢布莱克七世的建议。

我按照布莱克斯七号的建议更改了架构。我还必须更改 mapbox 调用,以便它从 getJSON 回调内部调用。看起来像这样:

var geojson = $.getJSON('/claims/placer',function(result){
        L.mapbox.map('map', 'mapbox.outdoors')
        .setView([49.72902, -121.43253], 12)
        .featureLayer.setGeoJSON(result);

    });

不,我可以在地图上显示查询到的数据!

【讨论】:

    猜你喜欢
    • 2017-06-06
    • 2017-05-14
    • 2012-12-09
    • 2013-08-27
    • 2013-03-11
    • 2011-09-22
    • 2014-09-03
    • 2019-04-26
    • 2015-06-29
    相关资源
    最近更新 更多