Geopackage无法将多边形渲染到地图上。

3
创建地图的代码:
 <div id="map" style="width: 1000px; height: 700px"></div>
 <script> 
    var map = L.map('map').setView([0,0], 1);
    L.tileLayer('https://api.mapbox.com/styles/v1/mapbox/streets-v10/tiles/{z}/{x}/{y}?access_token=pk.ey31IjoibnVtaW51czEiLCJhIjoiY2treTN3YzduekdwMDJubXNhMWNpemdicyJ9.McJEAeE0Jbj999Oz4pbsZg', {
        attribution: '<a href="https://www.maptiler.com/copyright/" target="_blank">&copy; MapTiler</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a>'
    }).addTo(map);

    var marker = L.marker([18.52, 73.86]).addTo(map);

这是正确创建地图的方法。现在,我正在尝试添加一个包含有关州数据的geopackage:https://biogeo.ucdavis.edu/data/gadm3.6/gpkg/gadm36_IND_gpkg.zip 当我使用教程代码将河流绘制到地图上时,它运行得很好:
var rivers = L.geoPackageFeatureLayer([], {
     geoPackageUrl: 'http://ngageoint.github.io/GeoPackage/examples/rivers.gpkg',
     layerName: 'rivers',

     style: {color: 'green'}
    }).addTo(map);

    L.geoJson(stateData).addTo(map); 

而当我将这个状态地理包上传到地理包查看器https://ngageoint.github.io/geopackage-js/时,它可以正确绘制所有内容。然而,当我尝试在我的地图中实现相同的内容时,地图可以正常渲染,但州界线没有被绘制在地图上;以下代码甚至没有任何提示:
var stater = L.geoPackageFeatureLayer([], {
     geoPackageUrl: 'assets/geospatial/gadm_states.gpkg',
     layerName: 'stater',

     style: {color: 'red'}
    }).addTo(map);

我想可能是因为gpkg文件中有多个图层,我没有正确地指定其中一个,所以我从GeoPackage Viewer中下载了我需要的图层作为geojson文件,但那也不起作用。有人能解释一下出了什么问题吗?

1个回答

1
我认为你在编造stater图层的名称。
我已经下载(并解压缩)了一部分GADM数据集,想查看其中包含的命名图层,然后在其上运行ogrinfo
$ wget https://biogeo.ucdavis.edu/data/gadm3.6/gpkg/gadm36_ESP_gpkg.zip
 [snip]
 2021-02-15 10:49:45 (3,56 MB/s) - “gadm36_ESP_gpkg.zip” saved [9767512/9767512]

$ unzip gadm36_ESP_gpkg.zip
Archive:  gadm36_ESP_gpkg.zip
  inflating: gadm36_ESP.gpkg         
  inflating: license.txt  

$ ogrinfo gadm36_ESP.gpkg 

INFO: Open of `gadm36_ESP.gpkg'
      using driver `GPKG' successful.
1: gadm36_ESP_0 (Multi Polygon)
2: gadm36_ESP_1 (Multi Polygon)
3: gadm36_ESP_2 (Multi Polygon)
4: gadm36_ESP_3 (Multi Polygon)
5: gadm36_ESP_4 (Multi Polygon)

现在,我可以将该文件放在一个小型Web服务器上,并设置一些基本的Leaflet示例,从geopackage中加载数据,其中包含五个不同的主题层,分别命名为gadm36_ESP_0gadm36_ESP_5

现在,我可以在一个小型Web服务器上放置该文件,并设置一些基本的Leaflet示例,从geopackage中加载数据,其中包含我知道存在的一个层

var provinces = L.geoPackageFeatureLayer([], {
     geoPackageUrl: 'https://ivan.sanchezortega.es/cors/2021-02-15-gpkg/gadm36_ESP.gpkg',
     layerName: 'gadm36_ESP_2',

     style: {color: 'red'}
}).addTo(map);

...而实时示例按预期工作:

working live example

所以:

  • 请检查您的geopackage结构,了解其中包含的命名图层。
  • 始终检查浏览器控制台中的错误,因为:
    • 不良的图层名称将导致“NULL几何列错误”
    • 托管geopackage的Web服务器可能配置不当(例如HTTPS或CORS问题)

非常感谢,您为我解决了两个问题:我有一个CORS问题和我使用了错误的图层名称。 - Numi
有没有办法查看geopackage文件内部的各种多边形名称,并在代码中引用它们?例如,如果我想更改表示以字母“A”开头的州的多边形的颜色,您有任何建议吗? - Numi
那是一个不同的问题。请勿在评论中问复杂问题。 - IvanSanchez
好的,我已经发布了一个新问题(https://stackoverflow.com/questions/66208220/dereferencing-features-in-geopackages),如果你能并且愿意回答它。 - Numi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接