-
Notifications
You must be signed in to change notification settings - Fork 1
/
shp2geojson.py
149 lines (120 loc) · 5.39 KB
/
shp2geojson.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import geopandas
import tkinter
from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter import messagebox
import os
import zipfile
import shutil
import patoolib
class SHP2GEOJSON:
def __init__(self):
# later define input folder name
self.root = tkinter.Tk().hide()
self.message = "No shp file/Output file wrong"
def __get_In_Out_filename(self):
self.filename = self.__askFile()
self.outfileName = self.filename.split("/")[-1]
def __askFile(self):
self.infileName = askopenfilename(title="Secect shp file", filetypes=(("shp files", "*.shp"), ("all files", "*.*")))
return self.infileName
def __warning_message(self):
messagebox.warning("Warning", self.message)
def __read_shp2geojson(self):
self.data = geopandas.read_file(self.filename)
return self.data
def __save2geojson(self):
# get single shp file name
if self.filename[-3:] in ["shp"]:
self.geojsonData = self.__read_shp2geojson()
self.geojsonData.to_file(
f"""{self.outdir}\{self.outfileName}.geojson""", driver='GeoJSON')
# Here track file path
# self.root.destroy() # close all window degets
self.root.withdraw() # hide Tk() window
def convert_shp_single(self):
self.__get_In_Out_filename()
self.outdir = tkinter.filedialog.askdirectory(title="Choose output folder")
self.__save2geojson()
# Multiple folder and zip and rar input ###
def convert_shp_multiple(self):
# Get input folder name
self.dirName = tkinter.filedialog.askdirectory(title="Select Input Folder")
# Get output folder name
self.outdir = tkinter.filedialog.askdirectory(title="Choose Output Folder")
self.root.withdraw()
self.all_file_names = self.__getListOfFilesNames_folder()
try:
for name in self.all_file_names:
self.filename = name
self.outfileName = name.replace("\\","/").split("/")[-1]
self.__save2geojson()
except Exception as err:
print(err)
#messagebox.showerror("Warning!",err)
def __getListOfFilesNames_folder(self):
self.listOfFilesNames = os.listdir(self.dirName)
self.allFilesNames = []
# Iterate over all the entries
for entry in self.listOfFilesNames:
self.fullPath = os.path.join(self.dirName, entry) # Create full path
if os.path.isdir(self.fullPath): # If entry is a directory then get the list of files in this directory
self.dirName = self.fullPath
self.allFilesNames = self.allFilesNames + self.__getListOfFilesNames_folder()
else:
self.allFilesNames.append(self.fullPath)
return self.allFilesNames
def __unzip(self):
# unzip the zip file to a new template folder
self.temp_folder = "temp_folder"
self.zipfilename = askopenfilename(filetypes=(("zip files","*.zip"),("all files","*.*")))
self.root.withdraw()
self.temp_path = os.getcwd()+"\%s"%self.temp_folder
with zipfile.ZipFile(self.zipfilename, 'r') as zip_ref:
zip_ref.extractall(self.temp_path)
def __del_unzip(self): # delete the unziped templete folder
self.temp_folder = "temp_folder"
shutil.rmtree(r"%s\%s"%(os.getcwd(),self.temp_folder))
def convert_shp_multiple_zip(self):
self.__unzip()
self.dirName = self.temp_path
self.outdir = tkinter.filedialog.askdirectory(title="Choose Output Folder")
self.all_file_names = self.__getListOfFilesNames_folder()
try:
for name in self.all_file_names:
self.filename = name
self.outfileName = name.replace("\\","/").split("/")[-1]
self.__save2geojson()
except Exception as err:
print(err)
# messagebox.showerror("Warning!",err)
self.__del_unzip()
def __unrar(self): ##unzip the zip file to a new tmeplete folder
self.rarfilename = askopenfilename(
title="Select rar file", filetypes=(("rar files","*.rar"),("all files","*.*")))
self.temp_folder = "temp_folder"
os.mkdir(self.temp_folder) # create a temple folder
self.root.withdraw()
self.temp_path = os.getcwd() + "\%s" % self.temp_folder
patoolib.extract_archive(self.rarfilename, outdir="%s\\%s"%(os.getcwd(), self.temp_folder))
def __del_unrar(self): ## delete the unziped templete folder
# self.ttt = self.unrar()
# self.temp_folder = str(self.ttt.split(".")[0])
shutil.rmtree(r"%s\%s"%(os.getcwd(), self.temp_folder))
def convert_shp_multiple_rar(self):
self.__unrar()
self.dirName = self.temp_path
self.outdir = tkinter.filedialog.askdirectory(title="Choose Output Folder")
self.root.withdraw()
self.all_file_names = self.__getListOfFilesNames_folder()
try:
for name in self.all_file_names:
self.filename = name
self.outfileName = name.replace("\\","/").split("/")[-1]
self.__save2geojson()
except Exception as err:
print(err)
# messagebox.showerror("Warning!",err)
self.__del_unrar()
if __name__ == "__main__":
SHP2GEOJSON().convert_shp_single()