· 5 years ago · Jan 20, 2021, 06:28 AM
1import pandas as pd
2import numpy as np
3import streamlit as st
4import time
5import json
6import os
7import pathlib
8import time
9
10import numpy as np
11
12import requests
13from requests.auth import HTTPBasicAuth
14import streamlit as st
15import os
16import path
17from glob import glob
18#import shutil
19import pandas as pd
20import base64
21files_path = [os.path.abspath(x) for x in os.listdir()]
22#st.text(files_path)
23import zipfile
24import io
25import glob
26from PIL import Image
27from sqlalchemy import create_engine
28import psycopg2
29from sqlalchemy.ext.declarative import declarative_base
30from sqlalchemy import Column, Integer, String, Date
31import sqlalchemy
32from sqlalchemy import create_engine
33
34
35
36def local_css(file_name):
37 with open(file_name) as f:
38 st.markdown(f'<style>{f.read()}</style>', unsafe_allow_html=True)
39
40# def remote_css(url):
41# st.markdown(f'<link href="{url}" rel="stylesheet">', unsafe_allow_html=True)
42#
43# def icon(icon_name):
44# st.markdown(f'<i class="material-icons">{icon_name}</i>', unsafe_allow_html=True)
45
46local_css("color2.css")
47
48
49st.title('Обрезка снимков Planet')
50im1 = Image.open('BAZILIK.jpg')
51# im2 = Image.open('Bailik2.jpg')
52#
53#
54#
55# full_img = Image.fromarray(np.hstack((np.array(im1),np.array(im2))))
56st.sidebar.image(im1,width=100)
57#st.sidebar(colo)
58TARGET_DIRECTORY = "/root/Planet/data/"
59ZIPFILE_NAME = "Planet_NEW.zip"
60PLANET_API_KEY = os.environ['PL_API_KEY'] = '440d79de58664460ba3c405b9b934fed'
61orders_url = 'https://api.planet.com/compute/ops/orders/v2'
62auth = HTTPBasicAuth(PLANET_API_KEY, '')
63response = requests.get(orders_url, auth=auth)
64headers = {'content-type': 'application/json'}
65orders = response.json()['orders']
66
67from planet import api
68client = api.ClientV1(PLANET_API_KEY)
69
70def place_order(request, auth):
71 response = requests.post(orders_url, data=json.dumps(request), auth=auth, headers=headers)
72 print(response)
73
74 if not response.ok:
75 d = response.status_code
76 return response
77
78 # raise Exception(response.content)
79 r = response.json()
80 # for t in r['field']['Details']:
81 # z = t['message']
82 # f = z.strip()
83 # f = z.split("/")
84 # error_scene = f[1].strip()
85 # if error_scene == "Item Type PSScene4Band doesn't exist":
86 # k ="Неверно выбран ID сцены"
87 # print(k)
88 # return(k)
89 X_n = "Not"
90 else:
91 return response
92
93
94
95import datetime
96
97
98def getcoordinates(name):
99 try:
100 connection = psycopg2.connect(
101 database="postgres",
102 user="postgres",
103 password="admin",
104 host="localhost",
105 port="5432"
106 )
107
108
109 print("Database opened successfully")
110
111 # print("Using Python variable in PostgreSQL select Query")
112 cursor = connection.cursor()
113 postgreSQL_select_Query = "select * from coordinates2 where name = %s"
114
115 cursor.execute(postgreSQL_select_Query, (name,))
116 coords_records = cursor.fetchall()
117 for row in coords_records:
118 print("coords ", row[0], )
119 print("Name ", row[1])
120 # print("Price = ", row[2])
121 return row[0]
122
123
124 except (Exception, psycopg2.Error) as error:
125 print("Error fetching data from PostgreSQL table", error)
126
127 finally:
128 # closing database connection
129 if (connection):
130 cursor.close()
131 connection.close()
132 print("PostgreSQL connection is closed \n")
133
134
135def zip_dir(directory, zipname):
136 """
137 Compress a directory (ZIP file).
138 """
139 if os.path.exists(directory):
140 outZipFile = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED)
141
142 # The root directory within the ZIP file.
143 rootdir = os.path.basename(directory)
144
145 for dirpath, dirnames, filenames in os.walk(directory):
146 for filename in filenames:
147 # Write the file named filename to the archive,
148 # giving it the archive name 'arcname'.
149 filepath = os.path.join(dirpath, filename)
150 parentpath = os.path.relpath(filepath, directory)
151 arcname = os.path.join(rootdir, parentpath)
152
153 outZipFile.write(filepath, arcname)
154
155 outZipFile.close()
156
157
158def download_order(order_url, auth, overwrite=False):
159 r = requests.get(order_url, auth=auth)
160 response = r.json()
161 try:
162 results = response['_links']['results']
163 results_urls = [r['location'] for r in results]
164 results_names = [r['name'] for r in results]
165 results_paths = [pathlib.Path(os.path.join('data', n)) for n in results_names]
166 print('{} items to download'.format(len(results_urls)))
167
168 for url, name, path in zip(results_urls, results_names, results_paths):
169 if overwrite or not path.exists():
170 print('downloading {} to {}'.format(name, path))
171 r = requests.get(url, allow_redirects=True)
172 path.parent.mkdir(parents=True, exist_ok=True)
173 open(path, 'wb').write(r.content)
174 else:
175 print('{} already exists, skipping {}'.format(path, name))
176
177 return dict(zip(results_names, results_paths))
178 except Exception as ex:
179 print(ex)
180
181def poll_for_success(order_url, auth, num_loops=1000):
182 count = 0
183 while (count < num_loops):
184 count += 1
185 r = requests.get(order_url, auth=auth)
186 response = r.json()
187 state = response['state']
188 print(state)
189 success_states = ['success', 'partial']
190 if state == 'failed':
191 raise Exception(response)
192 elif state in success_states:
193 st.success('Клипирование выполнено, ожидайте...')
194 time.sleep(2)
195 download_order(order_url, auth, overwrite=False)
196 break
197 time.sleep(10)
198
199engine = create_engine('postgres+psycopg2://ili:coordinates2@localhost/')
200
201
202d3 = st.date_input("Выберите диапазон дат", [])
203if len(d3) ==2:
204 #st.write(d3)
205 start_time = d3[0].strftime("%Y-%m-%dT%H:%M:%S.%S1Z")
206 finish_time = d3[1].strftime("%Y-%m-%dT%H:%M:%S.%S0Z")
207 # st.write(start_time,finish_time)
208 date_filter = api.filters.date_range("acquired", gte=start_time, lte=finish_time)
209 # st.write(date_filter)
210 #f_db = pd.read_sql_query('select * FROM coordinates2', con=engine)
211 if st.checkbox("Внести новую точку"):
212
213 x = st.text_input(label='Введите координаты пяти точек полигона.')
214 d_name = st.text_input("Name")
215 if d_name:
216
217 con = psycopg2.connect(
218 database="postgres",
219 user="postgres",
220 password="admin",
221 host="localhost",
222 port="5432"
223 )
224 cur = con.cursor()
225
226 # VALUES (%s)" % my_variable)
227 cur.execute(("INSERT INTO coordinates2 (COORDINATES,NAME) VALUES (%s , %s) ON CONFLICT (NAME) DO NOTHING"), (x, d_name))
228 con.commit()
229 con.close()
230
231
232 #x = st.text_input(label='Введите координаты пяти точек полигона. Первая и последняя точки должны совпадать. Коордитаты вводятся через запятую, последовательно: широта, долгота...')
233 #x
234 fff=[]
235 con = psycopg2.connect(
236 database="postgres",
237 user="postgres",
238 password="admin",
239 host="localhost",
240 port="5432"
241 )
242 cur = con.cursor()
243 cur.execute("select * from coordinates2 ")
244 # SELECT FROM (coordinates2 (1,'HHH')) AS t (coords,name)
245
246 rows = cur.fetchall()
247 for row in rows:
248 fff.append(row[1])
249
250 #con.close()
251
252 st.write(fff)
253
254 selected_indices = st.multiselect('Выберите полигон:', fff)
255
256 if selected_indices:
257
258 for i in selected_indices:
259 i = ''.join(str(i))
260 x = getcoordinates(i)
261
262 st.write(x,type(x))
263
264
265
266
267 # if selected_indices:
268 # f = (f_db[f_db['name'] == i])
269 # x_1 = l
270 # x = ''.join(str(e) for e in x_1)
271
272
273
274
275 #st.write(f)
276
277
278 #selected_indices = st.multiselect('Select rows:', f_db['name'])
279 #f = f_db[f_db['name'] == selected_indices]
280
281 if x != "":
282 coordinates_in = x.split(",")
283 dict_coord = []
284 for i in coordinates_in:
285 m = i.strip()
286 f = float(m)
287 dict_coord.append(f)
288 chunks_coord = [dict_coord[x:x + 2] for x in range(0, len(dict_coord), 2)]
289 df = pd.DataFrame(chunks_coord, columns=['lat', 'lon'])
290 df_2 = df[['lon', 'lat']]
291 df_2.columns = ['lat', 'lon']
292 #st.text(df_2)
293 st.write(df_2)
294
295 st.map(df_2)
296
297 clip_aoi = {
298 "coordinates": [chunks_coord],
299 "type": "Polygon"
300 }
301
302 geometry_filter = api.filters.geom_filter(clip_aoi, "geometry")
303 #st.write(geometry_filter)
304 item_types = ['PSScene4Band']
305 filter = api.filters.and_filter(date_filter, geometry_filter)
306 request = api.filters.build_search_request(filter, item_types)
307 results = client.quick_search(request)
308 dist = []
309 dist_2 = []
310
311 for item in results.items_iter(100):
312 # x= sys.stdout.write('%s\n' % item['id'])
313 x = item['id']
314 y = item['properties']['cloud_percent']
315 df = pd.DataFrame(columns=["Сцена", "Облачность"])
316 dist.append(x)
317 dist_2.append(y)
318 #dist_2.append(y)
319 df['Сцена'] = dist
320 df['Облачность'] = dist_2
321
322
323 max_ob = st.slider('Выберите облачность', 0, 100, 10, 1)
324 df = df[df['Облачность']<=max_ob]
325 st.write(df)
326
327
328 # dist = []
329 # dist_2 = []
330 # for item in results.items_iter(10):
331 # # x= sys.stdout.write('%s\n' % item['id'])
332 # x = item['id']
333 # y = item['properties']['cloud_percent']
334 # df = pd.DataFrame(columns=["i", "b"])
335 # dist.append(x)
336 # dist_2.append(y)
337 # print(y)
338 #st.checkbox(df, value=False, key=None)
339 #options = st.multiselect('Scena', dist)
340 #scene_d = st.multiselect('Выберите сцену', dist)
341 #scene_d = st.sidebar.multiselect(df['Сцена'])
342 st.sidebar.markdown("<h2 style='text-align: left; color: GRAY;'>Выберите сцены:</h2>", unsafe_allow_html=True)
343
344 #st.sidebar.text('Выберите сцены:')
345
346 check_boxes = [st.sidebar.checkbox(stock, key=df['Сцена']) for stock in df['Сцена']]
347
348 fort = ([stock for stock, checked in zip(df['Сцена'], check_boxes) if checked])
349 st.write(fort)
350
351 #st.write('Выбранная сцена:', scene_d)
352 scene_1 = []
353 if fort:
354 scene1 = fort
355 for i in scene1:
356 #scene_2 = i.strip()
357 scene_1.append(i)
358 #st.text("Выбранные ID:")
359 #st.text(scene_1)
360 if st.button('Скачать' ,key = "f"):
361
362
363 # else:
364 # st.write('Goodbye')
365
366 single_product = [
367 {
368 "item_ids": scene_1,
369 "item_type": "PSScene4Band",
370 "product_bundle": "analytic"
371 }
372 ]
373
374 clip = {
375 "clip": {
376 "aoi": clip_aoi
377 }
378 }
379
380 #st.text(clip)
381
382 request_clip = {
383 "name": "just clip",
384 "products": single_product,
385 "tools": [clip]
386 }
387
388 Response = place_order(request_clip, auth)
389
390 #st.write (request_clip)
391
392
393 if Response:
394
395 if Response.status_code == 400:
396 st.write("Попробуйте еще раз",Response)
397
398
399 if Response.status_code == 202:
400 #st.write("Верно 202", Response)
401 #st.write(Response.json()['id'])
402 order_id = Response.json()['id']
403 order_url = orders_url + '/' + order_id
404 #st.write(order_url)
405 #data_load_state = st.text('Loading data...')
406 # Notify the reader that the data was successfully loaded.
407 with st.spinner('Ожидайте...'):
408 poll_for_success(order_url, auth)
409 st.success('Файлы успешно загружены!')
410 #data_load_state.text('Loading data...done!')
411
412 #data_load_state.text('Загрузка завершена!')
413 zip_dir(TARGET_DIRECTORY, ZIPFILE_NAME)
414
415 # st.text(files_path)
416 linkUrl = "http://IP:8000/Planet/" + ZIPFILE_NAME
417 linkText = '<a href="{}">{}</a>'.format(linkUrl, 'Загрузить')
418
419 href = linkText
420 st.markdown(href, unsafe_allow_html=True)
421
422
423 if Response.status_code == 200:
424 # st.write("Верно 202", Response)
425 # st.write(Response.json()['id'])
426 order_id = Response.json()['id']
427 order_url = orders_url + '/' + order_id
428 # st.write(order_url)
429 # data_load_state = st.text('Loading data...')
430 # Notify the reader that the data was successfully loaded.
431 with st.spinner('Ожидайте...'):
432 poll_for_success(order_url, auth)
433 st.success('Файлы успешно загружены!')
434 # data_load_state.text('Loading data...done!')
435
436 # data_load_state.text('Загрузка завершена!')
437 zip_dir(TARGET_DIRECTORY, ZIPFILE_NAME)
438
439 # st.text(files_path)
440 linkUrl = "http://IP:8000/Planet/" + ZIPFILE_NAME
441 linkText = '<a href="{}">{}</a>'.format(linkUrl, 'Загрузить')
442
443 href = linkText
444 st.markdown(href, unsafe_allow_html=True)
445
446 if st.button('Удалить'):
447 import shutil
448 try:
449 st.write("/root/Planet/%s" % ZIPFILE_NAME)
450 os.remove("/root/Planet/%s" % ZIPFILE_NAME)
451 shutil.rmtree('/root/Planet/data/')
452
453 st.success('Дынные успешно удалены')
454 except Exception as ex:
455 st.error('Что-то пошло не так / или данных уже нет ')
456 #st.write(ex)
457
458
459
460
461 #
462