[GIS] Reducing size of KML file (after converting from Shapefile)

arcgis-10.2arcgis-desktopkmlogr2ogrshapefile

I have a shapefile of size 224 MB. I am using ArcGIS to convert it to a KML file. The process involves converting the shapefile to a feature layer and then converting the layer to KML.

An alternative method that I have tried is using ogr2ogr.

In both the cases, the KML file produced is around 500 MBs. I need it to be less than 250 MBs, so I can import it as a Google Fusion table.

I was informed that one of the best ways to cut size is to reduce precision of the coordinates to 5 decimal places (from its current 10 or so).

How do I go about changing the decimal places using either ogr2ogr or ArcGIS? Is there some other software that may help in this and also, are there any other strategies I may use to reduce the size of the KML file?

I tried using Notepad++ to open the KML file and then use regular expressions to change coordinate precision but for some reason this method is not working. If I make the change and try and save the file, all the data gets deleted and the KML file size changes to 0 bytes.

An alternative strategy that I was thinking of was to split my shapefiles into two or three files and convert them to KML separately, upload them to Google fusion tables and then append those. However, I am not sure of two things.

  1. How to split shapefiles into two or three smaller shapefiles?
  2. Whether I can easily append fusion tables together to create a larger fusion table?

Best Answer

Having come across the same problem, I have develop a rudimentary workaround, which is pretty quick and dirty. It almost halves the KML size but with a cost, it removes of all HTML popups and symbology/style specifications. It is good for pure viewing purposes.

I usually prefer using Generalize tool (requires at least Editor licence) to test various options until I am satisfied with the shapes that I want to process. Usually a value in between 0.5 and 0.8 meters gives me a decent outcome. A warning, the Generalize tool modifies the input data, so the best practice is to take a copy of it beforehand.

After reading the suggestions and doing some research, I have decided to develop a pretty rough python script for KML stripping process by using regular expression (intentionally avoiding XML parsing process). The code is as follows:

import re,os

kml_loc=r"C:\Temp\doc.kml"
f=open(kml_loc)
lines=f.readlines()
f.close()

all_text_0=''.join(lines)
all_text_0=' '.join(all_text_0.split())
# Remove HTML popup and shape styles
all_text_1=re.sub('<description>.*?</description>','<description></description>',all_text_0)
all_text_1=re.sub('<styleUrl>.*?</styleUrl>','',all_text_1)
all_text_2=all_text_1

# Round the coordinates to desired resolution
decimal_places_of_xy_resolution=6
for i in re.findall('<coordinates>(.*?)</coordinates>',all_text_1):
    fixed_part=' '.join([','.join(['{0:.{1}f}'.format(float(c), 
               [decimal_places_of_xy_resolution,0][c=='0']) for c in b.split(',') if c])  
               for b in i.split(' ') if b])
    all_text_2=re.sub(i,fixed_part,all_text_2,1)

# Write bew KML with a new name
new_kml=list(os.path.splitext(kml_loc))
new_kml[0]+='_REDUCTED'
f=open(''.join(new_kml),'wb')
f.write(all_text_2)
f.close()
Related Question