未捕获的 InvalidValueError:不是 Feature 或 FeatureCollection

Posted

技术标签:

【中文标题】未捕获的 InvalidValueError:不是 Feature 或 FeatureCollection【英文标题】:Uncaught InvalidValueError: not a Feature or FeatureCollection 【发布时间】:2014-05-01 10:40:30 【问题描述】:

在看到 Google Devs 最近的video 后,我决定制作一张英国的区域地图。这个网站上提到了一些我不得不忽略的可能性*

所以我最终使用了这个网站(数据下载示例页面):http://mapit.mysociety.org/area/11804.html

注意到 GeoJSON 下载 是第三个链接了吗?它的文件大小约为 1Mb。当我第一次尝试将它与我的地图一起使用时:

function initMap()
    var ukc = new google.maps.LatLng(54.8, -4.6);
    var mapOptions = 
        zoom: 5,
        center: ukc
    ;
    map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
    map.data.loadGeoJson('http://local.mapsite.com:8080/app/jsondata/eastern.json');


$(document).ready(function()
    initMap();
);

我收到上述错误:Uncaught InvalidValueError: not a Feature or FeatureCollection

修复尝试 1 - 谷歌搜索

谷歌搜索错误返回没有任何用处。

修复尝试 2 - 缩小它

我想这可能是野兽的绝对大小,所以我使用 mapshaper.org 将它缩小到更易于管理的 10K。 还是没有运气!

修复尝试 3 - Lint

也许我的 GeoJSON 格式错误?但它怎么会考虑它就在 mapit.org 上工作,但我发现了这个用于 linting GeoJSON 数据的精彩网站:http://geojsonlint.com/ - linting 奏效了!显然,GeoJSON 工作得非常好,以至于它在英国的所有荣耀中绘制了我的东英吉利多边形(注意 geojsonlint 使用 OpenStreetMap)。但仍然没有运气

修复尝试 4 - TopoJson

希望我可以组合这些区域并同时进行压缩,我拼命地认为 topojson 会起作用。我试过了 - 我仍然遇到同样的错误。这是我在 Google Drive 上共享的 topojson 文件的链接:someregions.json 不走运

修复尝试 5 - 添加功能代码到 JSON 的开头

当前 GeoJSON 文件开始 "bbox":[-0.745702,51.448473,1.767999,52.98991],"type":"GeometryCollection","geometries":...

我补充说:

"type": "Feature", "bbox":[-0.745702,51.448473,1.767999,52.98991],"type":"GeometryCollection","geometries":

修复尝试 6

重试不同的区域,因为它们在开始附近不包含 bbox 参数,而只是开始 “类型”:“多边形”,“坐标”:[ [ [ -3.155785, 53.427385 ],[ -3.151533, 53.427328 ],[...

仍然运气不佳

在(失败)结论中

即使我证明我的文件足够小linted并且在其他地方工作我仍然在尝试时从控制台收到那些令人愤怒的错误消息把它们放在我的地图上。

Uncaught InvalidValueError: not a Feature or FeatureCollection

这是我通过 GDrive 公开共享的缩小版 GeoJSON 文件:https://drive.google.com/file/d/0B42Aec8RKcHtNVNZZUxqV0Y5Rkk/edit?usp=sharing

我的下一次尝试将涉及 topojson 将所有区域压缩成一个具有内部边界的区域,但我想先在这里检查一下,看看是否有人知道我的问题可能是什么?因为那可能又浪费了几个小时的无用能量。

* 尝试使用 Ordanance Survey 数据失败,因为他们提供了 SHD 数据,而不是 SHP,如上一个关于该主题的问题所述。所以我无法使用 ogr2ogr 将其转换为 GeoJSON。

【问题讨论】:

请注意,Ordnance Survey 确实提供 SHP 数据,因为这是我们用来导入 MapIt 的数据:) MapIt 还有一个 simple_tolerance 参数来降低返回形状的复杂性。 嗨@MatthewSomerville。我按照指令here 建议查找条例调查的SHP 数据here,但只找到了SHD 数据文件。有没有机会给我指出正确的方向? 我看到您在该答案上留下的评论收到了可以在此处回答您的问题的回复 - 您需要在链接到的页面上打勾,然后提交表格以发送电子邮件以下载边界线数据。或者,您可以从我们维护的数据缓存中获取它parlvid.mysociety.org/os 【参考方案1】:

GeoJSON 的规范可以在http://geojson.org/geojson-spec.html 找到 相关(虽然是实验性的)Google Maps API 文档可以在https://developers.google.com/maps/documentation/javascript/3.exp/reference#Data找到。

因此,Google 地图似乎可以接受 GeoJSON,您需要将 MapIt 返回的多边形(或类似的)包装在 Feature 或 FeatureCollection 中,这是 bermuda-triangle 的示例:

   "type": "FeatureCollection",
    "features": [
       "type": "Feature",
         "geometry": 
           "type": "Polygon",
           "coordinates": 
              [
                [
                  [-80.190262,25.774252],
                  [-66.118292,18.466465],
                  [-64.75737,32.321384],
                  [-80.190262,25.774252]
                ]
              ]
         
      
    ]
  

http://mapit.mysociety.org/area/11804.html 提供的数据必须是:

   "type": "FeatureCollection",
    "features": [
       "type": "Feature",
         "geometry": /** paste here the complete output of 
                         http://mapit.mysociety.org/area/11804.geojson **/
      
    ]
  

【讨论】:

MapIt 返回有效的 GeoJSON,据我所知。正如您链接到的规范所述,“GeoJSON 对象可能表示几何、特征或特征集合。”和“下面的每个示例都代表一个完整的 GeoJSON 对象。”您能否指出 Polygon 必须包含在 Feature 和 FeatureCollection 中的哪些位置才有效?听起来 Google 地图要求 Feature 或 FeatureCollection,但我找不到任何 API 文档。 参考可以在developers.google.com/maps/documentation/javascript/3.exp/…找到(注意Data属于实验API-版本,以后可能文档会更详细)。那里的大多数方法都需要一个特性(当然,当你有多个特性时,你需要一个 FeatureCollection) 因此,正如我所建议的,Google Maps API 要求 Feature 或 FeatureCollection,但这与说 MapIt 返回的 GeoJSON 是“错误的”不同,也不是根据 GeoJSON 规范认为多边形必须包含在 Feature 和 FeatureCollection 中。【参考方案2】:

我遇到了同样的问题(或至少类似的问题)并通过引入一个额外的步骤解决了它。

数据来源: 我的语义网络在第一轮请求中以 GeoJSON 格式提供有关法国南部洞穴的数据。这是通过以下方式直接导入的:

map.data.loadGeoJson(theUrl);

由于我们可能希望使用这些数据独立于语义网络(该应用程序是一个胖客户端),因此洞穴通过 jStorage 在本地存储。 由于循环引用,迭代地图特征并将这些对象直接存储在jStorage 中失败。 我制作了一个手工制作的例程(不够通用,但适合目的)将map.data.Feature 转换为可以存储的 javascript 对象。

从 store 中获取数据时:

var cave =  $.jStorage.get(key);
map.data.addGeoJson(cave); 

抛出Uncaught InvalidValueError: not a Feature or FeatureCollection 错误。

但是:

var geojson = JSON.parse(cave);
map.data.addGeoJson(geojson);

工作正常。

我的解释是函数 addGeoJson 需要一个 javascript 对象而不是字符串。

geoJson 示例(原始“洞穴”)值:

 "type": "Feature", "geometry": "type": "Point", "coordinates": [5.368743302306143, 44.0421921072459],"id": "84.MON.014", "properties": "nom": "Aven du Grand Guérin", "nid": "7b4703-f387f6f544-0750e59f441be7bb30a7e097c5d725f7", "nature": "Aven", "nodeTime": 1400743203325, "dataId": "5b66137c-1461fdfe5ca-f528764d624db129b32c21fbca0cb8d6", "status": 1 

【讨论】:

这个答案解决了今晚让我发疯的问题。在阅读 Google Maps API 时,它说 addGeoJson 函数需要一个 PARSED 对象developers.google.com/maps/documentation/javascript/…【参考方案3】:

如果您希望将数据加载到 JavaScript 变量中,请使用它

var map = new google.maps.Map(document.getElementById("googleMap"), mapProp); var data = map.data.loadGeoJson("GeoJSONfilename.geojson");

googleMap 是您希望在其中显示地图的 div id,而 GeoJSONfilename.geojson 是您保存 GeoJSON 数据的位置。

【讨论】:

var mapProp = center: new google.maps.LatLng(41.152036, -81.336186), zoom: 12, mapTypeId: google.maps.MapTypeId.ROADMAP ;【参考方案4】:

我有同样的错误,但问题很简单。在我的 GeoJSON 上,而不是

"type": "Feature"

我有

"type": "feature"

(注意小写的“f”)

一旦我解决了这个问题,错误就消失了。

【讨论】:

以上是关于未捕获的 InvalidValueError:不是 Feature 或 FeatureCollection的主要内容,如果未能解决你的问题,请参考以下文章

如何修复Uncaught InvalidValueError:setPosition:不是LatLng或LatLngLiteral:在属性lat中:不是数字?

InvalidValueError:不是 HTMLInputElement 的实例

错误:InvalidValueError:setCenter:不是 LatLng 或 LatLngLiteral:在属性 lat:不是数字

为啥这不是 google.maps.Map 的地图实例? InvalidValueError:setMap:不是 Map 的实例;

InvalidValueError:initAutocomplete 不是 Google Places 和 Autocomplete API 的功能

错误:InvalidValueError:setCenter:不是LatLng或LatLngLiteral:在属性lat中:不是数字