在谷歌地图上覆盖 ESRI shapefile 的最佳方法?

Posted

技术标签:

【中文标题】在谷歌地图上覆盖 ESRI shapefile 的最佳方法?【英文标题】:Best way to overlay an ESRI shapefile on google maps? 【发布时间】:2011-07-20 05:05:22 【问题描述】:

在 Google 地图中叠加 shapefile 的最佳方式是什么?

经过一些阅读建议,将 shapefile 转换为 KML 并在 Google 地图中覆盖 KML 是一种选择。如果是这种情况,如何将 shapefile 转换为 KML?

我相信会有一些开源工具可用于这种转换。谁能指出将 shapefile 转换为 KML 而不会丢失任何数据的工具?

【问题讨论】:

gis.stackexchange 也可以提供帮助,例如gis.stackexchange.com/questions/68027/… 【参考方案1】:

我喜欢使用(开源和 gui 友好)Quantum GIS 将 shapefile 转换为 kml。

Google Maps API 仅支持 subset of the KML standard。一个限制是文件大小。

要减小文件大小,您可以Quantum GIS 的“简化几何图形”功能。这可以“平滑”多边形。

然后您可以选择您的图层并在其上执行“另存为 kml”。

如果您需要处理一堆文件,可以从 osgeo4w shell 使用 Quantum GIS 的 ogr2ogr 命令批处理。

最后,我建议压缩您的 kml(使用您最喜欢的压缩程序)以减小文件大小并将其保存为 kmz。

【讨论】:

1. ctrl-shift-v 加载形状文件:qgis.org/en/docs/user_manual/working_with_vector/…; 2.另存为KML:townshipgis.com/resources/problems-and-workarounds/…【参考方案2】:

截至 2019 年 3 月 12 日,FusionTables 已不复存在...

使用http://www.shpescape.com/ 将Shapefile 导入Google FusionTables (http://www.google.com/fusiontables),然后您可以通过多种方式使用数据,例如。使用 GoogleMaps 显示它。

【讨论】:

程序本身运行良好。然而,在我的例子中,一些形状没有被转换(例如,坐标没有被转换)。 这行得通。完成程序后,需要标记融合图表公共访问并添加api密钥到谷歌地图 与许多其他实验性谷歌产品一样,谷歌融合表也将很快被淘汰support.google.com/fusiontables/answer/9185417【参考方案3】:

您是指Esri shapefile 中的shapefile 吗?无论哪种方式,您都应该能够使用ogr2ogr 执行转换,它在GDAL 包中提供。您需要 .shp 文件,最好是对应的 .dbf 文件(它将提供上下文信息)。

另外,在将 shapefile 转换为 KML 之前,请考虑使用 MapShaper 之类的工具来降低 shapefile 的复杂性;根据您需要多少细节,您将大大减少文件大小。

【讨论】:

【参考方案4】:

我不会使用 KML。相反,请使用您现在可以在 Google Maps API 中本地使用的 GeoJSON。这是原始响应中不存在的较新功能。

在任何情况下,只需打开Quantum GIS 中的SHP 文件,然后您就可以将其输出为您喜欢的任何格式(KML、GeoJSON)。

如果您使用的是 Google Maps for Work,我发现了一个高级扩展程序,可以直接处理加载 shapefile,您可以直接连接到从 ESRI 生成的 shapefile。我在 CMaps 网站上进行了搜索,发现这个 sn-p 按州 shapefile 加载美国:https://gmapsplugin.net/cmapsanalytics/assets/shapes/usstates.shp

var cMap = new centigon.locationIntelligence.MapView();
    cMap.key([your_api_key]);


    cMap.layerNames(["Basic Shapes"]);
    cMap.dbfKeys([['Alabama','Alaska','Arizona','Arkansas','California','Colorado','Connecticut','Delaware','District of Columbia','Florida','Georgia','Hawaii','Idaho','Illinois','Indiana','Iowa','Kansas','Kentucky','Louisiana','Maine','Maryland','Massachusetts','Michigan','Minnesota','Mississippi','Missouri','Montana','Nebraska','Nevada','New Hampshire','New Jersey','New Mexico','New York','North Carolina','North Dakota','Ohio','Oklahoma','Oregon','Pennsylvania','Rhode Island','South Carolina','South Dakota','Tennessee','Texas','Utah','Vermont','Virginia','Washington','West Virginia','Wisconsin','Wyoming']]);
    cMap.userShapeKeys([['Massachusetts','Minnesota','Montana','North Dakota','Hawaii','Idaho','Washington','Arizona','California','Colorado','Nevada','New Mexico','Oregon','Utah','Wyoming','Arkansas','Iowa','Kansas','Missouri','Nebraska','Oklahoma','South Dakota','Louisiana','Texas','Connecticut','New Hampshire','Rhode Island','Vermont','Alabama','Florida','Georgia','Mississippi','South Carolina','Illinois','Indiana','Kentucky','North Carolina','Ohio','Tennessee','Virginia','Wisconsin','West Virginia','Delaware','District of Columbia','Maryland','New Jersey','New York','Pennsylvania','Maine','Michigan','Alaska']]); 
    cMap.labels([['Massachusetts','Minnesota','Montana','North Dakota','Hawaii','Idaho','Washington','Arizona','California','Colorado','Nevada','New Mexico','Oregon','Utah','Wyoming','Arkansas','Iowa','Kansas','Missouri','Nebraska','Oklahoma','South Dakota','Louisiana','Texas','Connecticut','New Hampshire','Rhode Island','Vermont','Alabama','Florida','Georgia','Mississippi','South Carolina','Illinois','Indiana','Kentucky','North Carolina','Ohio','Tennessee','Virginia','Wisconsin','West Virginia','Delaware','District of Columbia','Maryland','New Jersey','New York','Pennsylvania','Maine','Michigan','Alaska']]); 

    cMap.polyDataSources([centigon.locationIntelligence.CMapAnalytics.DATA_PROVIDERS.SHAPE_DATAPROVIDER]);
    cMap.layerTypes([centigon.mapping.Layer.TYPE.POLY]);
    cMap.locations([["https://gmapsplugin.net/cmapsanalytics/assets/shapes/usstates.shp"]]);

    cMap.panTo("USA");
    cMap.zoomLevel(3);

【讨论】:

【参考方案5】:

Free "Export to KML" script for ArcGIS 9

Here is a list 某人找到的可用方法。

另外,在我看来,多边形层最有效的表示是使用 Google Maps API 的折线编码,它可以显着压缩 lat-lng 数据。但进入该格式需要工作:使用 ArcMap 将 Shape 导出为 lat/lng 坐标,然后使用 Google Maps API 转换为折线。

【讨论】:

链接已损坏!【参考方案6】:

为了更新这些答案,ESRI 在 ArcMap 10.X 中包含了这个工具,称为 Layer to KML。此外,还存在一个Map to KML 工具。

只需导入所需图层(矢量或栅格)并选择输出位置、分辨率等。非常简单的工具。

【讨论】:

【参考方案7】:

2018 年了...我发现这个很棒的在线工具 http://mapshaper.org/ 可以将 ESRI shapefile 转换为 SVG、TopoJSON、GeoJSON。

这里是如何使用它的解释https://www.statsilk.com/maps/convert-esri-shapefile-map-geojson-format

快速而直接! :)

【讨论】:

mapshaper 没有提出问题的谷歌地图图层

以上是关于在谷歌地图上覆盖 ESRI shapefile 的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

有没有可能在谷歌地图上制作工具栏?

无法在谷歌地图上看到多个标记

如何在谷歌地图 api V3 中偏移中心点

如何使用 api 在谷歌地图中仅显示一个国家或特定区域?

怎么在谷歌地图上做标记呀

如何在谷歌地图上画线