113

My users are sending me point data that were digitized using Google Earth.

How can I convert their KML to a shapefile and vice versa?

0

23 Answers 23

143

Using the open source ogr2ogr from GDAL/OGR:

ogr2ogr -f 'ESRI Shapefile' output.shp input.kml

or for the reverse:

ogr2ogr -f KML output.kml input.shp 

As noted in grego's comment below, you may need to use double quotes instead of single quotes for the output format option (e.g. "ESRI Shapefile" for the Windows command line). See also the gdal wiki.

0
35

ArcGIS 10 has a GP tool called KML To Layer that converts KML to a feature class. Search for KML using the new search. I've used this to take the oil spill kml feeds from Google and convert them into SHP.

KML To Layer can only create a geodatabase feature class so that needs to be followed by a Feature Class To Feature Class step to convert it to a shapefile.

0
21

Use ogr2ogr, but if you're not interested in a command line, try ogr2gui - a really simple front end for ogr2ogr.

12

To use spatial data published as a KML or KMZ file in ArcGIS you must first convert the KML to a feature class (shapefile). The University of Connecticut has a published a script for creating shapefiles from KML called KML_to_Shp.tbx. It works quite well and you can use it from ArcToolbox. Because KML will (should) always be in geographic coordinates (WGS84), you will eventually want to transform them to UTM Zone 15N NAD83...

As with all new tools, review the documentation on prior to use. This can be found on the UCONN’s Center for Land Use Education and Research web site. Once you add it to your toolbox and understand its limitations, the tool is very straight forward to use.

http://clear.uconn.edu/tools/kml_to_shp/index.htm

0
11

One more commercial product that bears mentioning is Global Mapper. This falls in the category of view, convert, re-project almost any geographic data you can imagine. I use the free version heavily in a class I teach and almost everyone walks away commenting on how this is the swiss army knife of GIS tools (though the free version doesn't do translations, it exposes all the menu's and options). Well worth the cost in my experience.

11

QGIS has become much more robust for the conversion between kml and shp. Just use the Save As from the right click menu on the layer. Or open up each of those file types from the Add New Layer menu, be sure to change the file type in the dialog box.

11

SL-King's fdo2fdo application, which uses the open source FDO libraries, allows you to perform KML to SHP and visa versa translations. It includes both a GUI (which express format-to-format translations and more customized schema mapping translations) as well as a commandline tool.

For proprietary applications, Safe Software's FME gives you amazing control over how you map the source information into destination. If you have ArcGIS, you can access this via the Data Interoperability Extension (list of formats) at additional cost.

If they are just point features with no attributes, I'd consider parsing the XML into something you can easily import like a CSV; you're just looking for the data between the coordinates tags.

11

If you are interested in command line tools, you can use GDAL/OGR from OSGEO.

Link

9

If you'd like a GUI, you can use QGIS. It uses OGR/GDAL in the background.

9

Another option is to use XToolsPro, a third-party extension that works in ArcGIS. Amongst their many handy conversion tools is a "Import Data from KML" function.

9

FME posted a beta for an online tool that handles many different types of conversion, including this. http://fmeserver.com/userweb/sharper/Portal/EasyTranslator/index.html This converter should really help you.

1
  • The link in this answer is broken.
    – PolyGeo
    Feb 5 at 11:26
7

You can also look at FME from Safe Software http://www.safe.com

There is a 14 day trial available. FME lets you even map the attributes from your KML file to ESRI SHP format during the data conversion/migration process besides the ability to filter the KML point files based on certain attributes or spatial extents.

There is also the option to do batch conversion when you have a large set of KML files from your users.

6

use OGR for command line control, Google Earth Pro will give you a graphical way to convert, as will a variety of other apps

6

ET GeoWizards also has an import from Google Earth option, which will convert KML or KMZ files to feature class. > http://www.ian-ko.com/ET_GeoWizards/gw_MainFeatures.htm

If you're looking for an open source option, I see MapWindow was just updated, and there are a couple of plugins for converting to and from KML and shapefile.

6

The Open Source MapWindow GIS has a free extension (KML2Shapefile) for converting KML/KMZ files into shapefiles.

5

If you have the interop extension just load that KML straight into ArcMap and export to shp.

Although the opposite answer to your Q, in case someone has come here to do the vice versa, I find this script perfect to go from SHP-->KML http://arcscripts.esri.com/details.asp?dbid=14273

5

If you would like to convert your files online, try MyGeodata GIS formats and coordinate system converter. It is based on ogr2ogr (gdal/ogr library) - so almost all known GIS formats and coordinate systems are supported...

4

A few options I didn't see on any of the responses to add additional resources for converting KML to SHP would be the follow:

MyGeodata Converter

Online converter of Keyhole Markup Language format to ESRI Shapefile format (KML to SHP) is fast and easy to use tool for both individual and batch conversions. Converter also supports more than 90 others vector and rasters GIS/CAD formats and more than 3 000 coordinate reference systems.

Free Geography Tools covers and provides a tutorial of Zonums Software tool

3

Zonum Solutions' Online KML to Shapefile converter also works well:

http://www.zonums.com/online/kml2shp.php

3

A good and easy help that might produce a more clean results is to convert KML to GPX first (there are several open-source software that can do it) and open the respective data (GPX has 5 different class of information: Waypoints, Trackpoints, Routepoints, Tracks and Routes) using the ogr2ogr from GDAL/OGR in QGIS and save it directly in .SHP file format.

It's quite easy also to use batch process for large quantity of data (using the Merge Vector Layers from SAGA for example) to produce a single shape file if desired and you can also clear the empty attributes before the final "Save as SHP".

Take special attention to the codification system if strange characters appear on your final result... you can choose the proper one at the moment you are adding new vector data to your map.

1

Here is one way using the rgdal package in R:

install.packages("rgdal")
library(rgdal) #load package
kmlfile=readOGR("yourkmlfilehere.kml") #load KML
writeOGR(kmlfile,"yourshapepath",layer="shapename", driver="ESRI Shapefile") #save shape
0
-1

Another tip: If you want to convert multiple KMLs in a folder/directory at once to shapefile using the command line, open up cmd in the folder and type this in:

for /R %f in (*.kml) do ogr2ogr -f "ESRI Shapefile" "%~dpnf.shp" "%f"

Note: It will use the name of the KML as the name of the shapefile so make sure your KMLs have the proper naming formats for shapefiles. The shapefile will be created in the same directory as the corresponding kml. KMLs in sub-directories will be converted to shapefiles too.

-1

I struggled a lot to get gdal/ogr working on my system, if you too are experiencing something similar, here is a way around using libraries that are easily installed using pip/conda across all OS.

import geopandas as gpd
from bs4 import BeautifulSoup
from shapely.geometry.polygon import Polygon

doc = open('file.kml').read()
soup = BeautifulSoup(doc, features="lxml")
coord=[]
for i in soup.findAll('coordinates'):
    coord.append(i.contents)
xyz = coord[0][0].strip().split(' ')
finalres=[]
for i in xyz:
    latlon=[]
    latlon.append(float(i.split(',')[0]))
    latlon.append(float(i.split(',')[1]))
    finalres.append(latlon)

poly = Polygon(finalres)
gdf = gpd.GeoDataFrame(index=[0], crs='epsg:4326', geometry=[poly])
gdf.to_file("file.shp")

Not the answer you're looking for? Browse other questions tagged or ask your own question.