Files
Photovoltaic_Fault_Detector/GPS_Panel/Enumeration_KML.ipynb

424 lines
66 KiB
Plaintext
Raw Normal View History

2020-11-13 00:19:20 -03:00
{
"cells": [
{
"cell_type": "code",
2020-12-17 18:46:01 -03:00
"execution_count": 159,
2020-11-13 00:19:20 -03:00
"metadata": {},
2020-12-01 22:42:41 -03:00
"outputs": [],
2020-11-13 00:19:20 -03:00
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"from matplotlib import path\n",
"import matplotlib.patches as patches\n",
"from skimage import draw\n",
"import scipy.ndimage as ndimage\n",
"import Utils\n",
"import georasters as gr\n",
"import cv2\n",
"from Utils import doubleMADsfromMedian\n",
"from skimage.transform import resize\n",
"import pickle\n",
"import simplekml\n",
"\n",
"def order_rect(List_P_strings, top_bottom = False):\n",
" #If top_bottom is false then sort right left\n",
" if not top_bottom:\n",
" List_P_strings = [[(List_P[0][1],List_P[0][0]),\n",
" (List_P[1][1],List_P[1][0]),\n",
" (List_P[2][1],List_P[2][0]),\n",
" (List_P[3][1],List_P[3][0])] for List_P in List_P_strings]\n",
" \n",
" bboxes=sorted(List_P_strings, key=lambda x: x[0][0])\n",
" bboxes = [(P[0][0], P[0][1], P[2][0]-P[0][0], P[2][1]-P[0][1]) for P in bboxes]\n",
" df=pd.DataFrame(bboxes, columns=['x','y','w', 'h'], dtype=int)\n",
" \n",
"\n",
" df[\"x2\"] = df[\"x\"]+df[\"w\"] # adding column for x on the right side\n",
" df = df.sort_values([\"x\",\"y\", \"x2\"]) # sorting\n",
"\n",
"\n",
" for i in range(2): # change rows between each other by their coordinates several times \n",
" # to sort them completely \n",
" for ind in range(len(df)-1):\n",
" # print(ind, df.iloc[ind][4] > df.iloc[ind+1][0])\n",
" if df.iloc[ind][4] > df.iloc[ind+1][0] and df.iloc[ind][1]> df.iloc[ind+1][1]:\n",
" df.iloc[ind], df.iloc[ind+1] = df.iloc[ind+1].copy(), df.iloc[ind].copy()\n",
" \n",
" L_F = [np.array([[box[0], box[1]], \n",
" [box[0] + box[2], box[1]], \n",
" [box[0] + box[2], box[1] + box[3]], \n",
" [box[0], box[1] + box[3]]]) for box in df.values.tolist()]\n",
" \n",
" if not top_bottom:\n",
" L_F = [[(List_P[0][1],List_P[0][0]),\n",
" (List_P[1][1],List_P[1][0]),\n",
" (List_P[2][1],List_P[2][0]),\n",
" (List_P[3][1],List_P[3][0])] for List_P in L_F]\n",
" return np.array(L_F) "
]
},
{
"cell_type": "markdown",
"metadata": {},
2020-11-18 03:05:29 -03:00
"source": [
"# Parameters"
]
2020-11-13 00:19:20 -03:00
},
{
"cell_type": "code",
2020-12-17 18:46:01 -03:00
"execution_count": 221,
2020-11-13 00:19:20 -03:00
"metadata": {},
"outputs": [],
"source": [
"#path_T = \"Thermo.tif\"\n",
"#path_String = \"Thermo_String_PV01.tif\"\n",
"\n",
2020-12-17 18:46:01 -03:00
"path_T = \"Los_Loros/TH_02_index_thermal_ir.tif\"\n",
"path_String = \"Los_Loros/Raster_Test.tif\"\n",
"ZonaPV = 'Test'\n",
"path_kml_panel = 'Los_Loros/KML/Paneles_' + ZonaPV +'.kml'\n",
"path_kml_mesa ='Los_Loros/KML/Mesa_' + ZonaPV +'.kml'\n",
"path_dict = 'Los_Loros/KML/Mesa_' + ZonaPV + '.pickle'\n",
2020-11-13 00:19:20 -03:00
"\n",
2020-12-17 18:46:01 -03:00
"#panel_size = (11 , 21)\n",
2020-11-13 00:19:20 -03:00
"#panel_size = (37 , 17) #weight, height size#\n",
"#panel_size = (20 , 35)\n",
2020-12-17 18:46:01 -03:00
"\n",
"split_Weight, split_Height = (10,2)\n",
"overlap = -0.005\n",
2020-11-13 00:19:20 -03:00
"order_top_bottom = False # order top bottom or right left\n",
"\n",
"\n",
"GR_String = gr.from_file(path_String)\n",
2020-11-18 03:05:29 -03:00
"GR_T = gr.from_file(path_T)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Enumerate Tables and Panels"
]
},
{
"cell_type": "code",
2020-12-17 18:46:01 -03:00
"execution_count": 222,
2020-11-18 03:05:29 -03:00
"metadata": {},
"outputs": [],
"source": [
2020-11-13 00:19:20 -03:00
"\n",
"label_im, nb_labels = ndimage.label(GR_String.raster.data > 0)#, structure= np.ones((2,2))) ## Label each connect region\n",
"\n",
" \n",
"L_strings = {} # {name: '001', points:(top-left, top-right, bottom-right, bottom-left) (x,y), 'panels' : }\n",
"\n",
"epsilon = 0\n",
"\n",
"List_P_strings = []\n",
"for i in range(1, nb_labels + 1):\n",
" \n",
" countours, hierarchy = cv2.findContours(np.uint8(label_im == i), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)\n",
" x_max = np.max(countours[0][:, 0, 0]) + epsilon\n",
" y_max = np.max(countours[0][:, 0, 1]) + epsilon\n",
" x_min = np.min(countours[0][:, 0, 0]) - epsilon\n",
" y_min = np.min(countours[0][:, 0, 1]) - epsilon\n",
" \n",
" List_P_strings.append([(x_min, y_min), (x_max, y_min), (x_max, y_max), (x_min, y_max)])\n",
"\n",
" \n",
"for i,List_P in enumerate(order_rect(List_P_strings, top_bottom=order_top_bottom), 1):\n",
" \n",
" L_strings[str(i)] = {'id': i, \n",
" 'points' : List_P, \n",
" 'panels' : {}, \n",
" 'status': 'default', \n",
2020-12-17 18:46:01 -03:00
" 'T': np.mean(GR_T.raster.data[List_P[0][1]:List_P[2][1],List_P[0][0]:List_P[2][0]])}\n",
2020-11-13 00:19:20 -03:00
"\n",
"for string_key in L_strings.keys():\n",
" \n",
" string = L_strings[string_key]\n",
" string['panels'] = {}\n",
" Points = Utils.order_points_rect(string['points']).astype(np.int)\n",
" \n",
" ## If strings is vertical or horizontal\n",
2020-12-17 18:46:01 -03:00
" #if (Points[2][0] - Points[0][0]) > (Points[2][1] - Points[0][1]):\n",
" # split_Weight, split_Height = np.int((Points[2][0] - Points[0][0]) / panel_size[0]) , np.int((Points[2][1] - Points[0][1]) / panel_size[1])\n",
" #else:\n",
" # split_Weight, split_Height = np.int((Points[2][0] - Points[0][0]) / panel_size[1]) , np.int((Points[2][1] - Points[0][1]) / panel_size[0])\n",
2020-11-13 00:19:20 -03:00
"\n",
2020-12-17 18:46:01 -03:00
" #split_Weight = max(split_Weight, 1)\n",
" #split_Height = max(split_Height, 1)\n",
2020-11-13 00:19:20 -03:00
" M, maxWidth, maxHeight = Utils.perspectiveTransform(Points)\n",
" sub_division = Utils.subdivision_rect([split_Weight, split_Height], maxWidth, maxHeight, overlap)\n",
" sub_division_origin = np.uint(cv2.perspectiveTransform(np.array(sub_division), np.linalg.inv(M)))\n",
" \n",
" for i,panels_coord in enumerate(order_rect(sub_division_origin, order_top_bottom),1):\n",
" string['panels'][str(i)] = {'id' : i,\n",
" 'points' : panels_coord,\n",
" 'status': 'default', \n",
2020-12-17 18:46:01 -03:00
" 'T' : np.mean(GR_T.raster.data[panels_coord[0][1]:panels_coord[2][1], panels_coord[0][0]:panels_coord[2][0]]),\n",
2020-11-13 00:19:20 -03:00
" 'severidad': 'default'} \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
2020-11-18 03:05:29 -03:00
"source": [
"# Save dictionary with gps data"
]
2020-11-13 00:19:20 -03:00
},
{
"cell_type": "code",
2020-12-17 18:46:01 -03:00
"execution_count": 223,
2020-11-13 00:19:20 -03:00
"metadata": {},
"outputs": [],
"source": [
"## Save List in coordinate latitud and longitude ###\n",
"geot = GR_String.geot\n",
"L_strings_coord = {}\n",
" \n",
"for string_key in L_strings.keys():\n",
" \n",
" string = L_strings[string_key]\n",
" points = string['points']\n",
" string_coord = {'id': 'Mesa_' + str(string['id']).zfill(3), \n",
" 'points': Utils.pixel2gps(points, geot), \n",
" 'panels': {}, \n",
" 'status': string['status'], \n",
" 'T' : string['T']}\n",
" \n",
" for panel_key in string['panels'].keys():\n",
" \n",
" panel = string['panels'][panel_key]\n",
" points = panel['points']\n",
" panel_coord = {'id': panel['id'],\n",
" 'points': Utils.pixel2gps(points, geot), \n",
" 'status': panel['status'], \n",
" 'prob': 0.0, \n",
2020-12-17 18:46:01 -03:00
" 'T': panel['T'], \n",
2020-11-13 00:19:20 -03:00
" 'severidad': 'default'}\n",
" \n",
" string_coord['panels'][panel_key] = panel_coord\n",
" \n",
" L_strings_coord[string_key] = string_coord\n",
2020-12-17 18:46:01 -03:00
"\n"
2020-11-13 00:19:20 -03:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Display image"
]
},
{
"cell_type": "code",
2020-12-17 18:46:01 -03:00
"execution_count": 224,
"metadata": {
"scrolled": true
},
2020-11-13 00:19:20 -03:00
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2020-12-17 18:46:01 -03:00
"image/png": "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
2020-11-13 00:19:20 -03:00
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
2020-12-17 18:46:01 -03:00
"image/png": "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
2020-11-13 00:19:20 -03:00
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"## Load List in coordinate latitud and longitude to pixels ###\n",
2020-12-17 18:46:01 -03:00
"string = L_strings_coord['3']\n",
2020-11-13 00:19:20 -03:00
"panels = string['panels']\n",
"\n",
"\n",
"epsilon = 0\n",
"matrix_expand_bounds = [[-epsilon, -epsilon],[+epsilon, -epsilon], [+epsilon, +epsilon], [-epsilon, +epsilon]]\n",
"\n",
"#geot = GR_RGB.geot\n",
"geot = GR_T.geot\n",
"geot_S = GR_String.geot\n",
"\n",
"\n",
"Points = Utils.gps2pixel(string['points'], geot) + matrix_expand_bounds\n",
"\n",
"\n",
"\n",
"plt.figure(0)\n",
"plt.figure(figsize=(16, 16))\n",
"plt.imshow(GR_String.raster.data)\n",
"plt.title('Origin Image')\n",
"ax = plt.gca()\n",
"\n",
"for Poly_key in L_strings_coord.keys():\n",
" \n",
" Poly = L_strings_coord[Poly_key]\n",
" poly = patches.Polygon(Utils.gps2pixel(Poly['points'],geot_S),\n",
" linewidth=2,\n",
" edgecolor='red',\n",
" alpha=0.5,\n",
" fill = True)\n",
" plt.text(np.mean([x[0] for x in Utils.gps2pixel(Poly['points'],geot_S)]), \n",
" np.mean([y[1] for y in Utils.gps2pixel(Poly['points'],geot_S)]) , \n",
" str(Poly['id']).split('_')[-1], bbox=dict(facecolor='red', alpha=0.8), fontsize=10)\n",
"\n",
" ax.add_patch(poly)\n",
" \n",
"plt.figure(1)\n",
"plt.figure(figsize=(16, 16))\n",
2020-12-17 18:46:01 -03:00
"#plt.imshow(GR_T.raster[0,Points[0][1] : Points[2][1], Points[0][0]: Points[2][0]])\n",
"plt.imshow(GR_T.raster[Points[0][1] : Points[2][1], Points[0][0]: Points[2][0]])\n",
2020-11-13 00:19:20 -03:00
"#plt.imshow((GR_RGB.raster[:3,:,:]).transpose((1, 2, 0))[Points[0][1] : Points[2][1], Points[0][0]: Points[2][0],:])\n",
"\n",
"plt.title('Subdive Origin Image')\n",
"ax = plt.gca()\n",
"\n",
"for Poly_key in panels.keys():\n",
" \n",
" Poly = panels[Poly_key]\n",
" poly = patches.Polygon(Utils.gps2pixel(Poly['points'],geot) - (Points[0][0], Points[0][1]),\n",
" linewidth=2,\n",
" edgecolor='red',\n",
" fill = False)\n",
" plt.text(np.mean([x[0] for x in Utils.gps2pixel(Poly['points'],geot) - (Points[0][0], Points[0][1])]), np.mean([y[1] for y in Utils.gps2pixel(Poly['points'],geot) - (Points[0][0], Points[0][1])]) , \n",
" str(Poly['id']), bbox=dict(facecolor='red', alpha=0.0), fontsize=8)\n",
"\n",
" ax.add_patch(poly)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Save KML"
]
},
{
"cell_type": "code",
2020-12-17 18:46:01 -03:00
"execution_count": 225,
2020-11-13 00:19:20 -03:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Listo\n"
]
}
],
"source": [
2020-12-17 18:46:01 -03:00
"\n",
"## Save List in coordinate latitud and longitude ###\n",
"with open(path_dict, 'wb') as handle:\n",
" pickle.dump(L_strings_coord, handle, protocol=pickle.HIGHEST_PROTOCOL)\n",
2020-11-18 03:05:29 -03:00
"\n",
"## Load List in coordinate latitud and longitude ###\n",
"with open(path_dict, \"rb\") as fp:\n",
" L_strings_coord = pickle.load(fp)\n",
2020-11-13 00:19:20 -03:00
"\n",
"kml=simplekml.Kml()\n",
"\n",
"\n",
"for string_key in L_strings_coord.keys():\n",
" \n",
" string = L_strings_coord[string_key]\n",
" points = string['points']\n",
" \n",
2020-12-17 18:46:01 -03:00
" pmt = kml.newpolygon(name= string['id'], \n",
" outerboundaryis = points)\n",
2020-11-13 00:19:20 -03:00
" pmt.extendeddata.newdata(name='Mesa', value=string['id'])\n",
2020-12-17 18:46:01 -03:00
" pmt.extendeddata.newdata(name= 'T°', value= string['T'])\n",
" \n",
2020-11-13 00:19:20 -03:00
"kml.save(path_kml_mesa)\n",
"\n",
"\n",
"kml=simplekml.Kml()\n",
"\n",
"\n",
"for string_key in L_strings_coord.keys():\n",
" \n",
" string = L_strings_coord[string_key]\n",
" points = string['points']\n",
" \n",
" for panel_key in string['panels'].keys():\n",
" panel = string['panels'][panel_key]\n",
" points = panel['points']\n",
" \n",
" pmt = kml.newpolygon(outerboundaryis = points)\n",
" pmt.extendeddata.newdata(name= 'Id integer', value= str(string_key).zfill(3) + '_' + str(panel['id']).zfill(3))\n",
" pmt.extendeddata.newdata(name= 'Id panel', value= str(panel['id']).zfill(3))\n",
" pmt.extendeddata.newdata(name='Zona PV', value= ZonaPV)\n",
" pmt.extendeddata.newdata(name='Cód. Fall', value= 0)\n",
" pmt.extendeddata.newdata(name= 'Tipo falla', value= panel['status'])\n",
" pmt.extendeddata.newdata(name= 'Mesa', value= string['id'])\n",
2020-12-17 18:46:01 -03:00
" pmt.extendeddata.newdata(name= 'T°', value= panel['T'])\n",
2020-11-13 00:19:20 -03:00
" \n",
"kml.save(path_kml_panel)\n",
"print('Listo')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.7"
}
},
"nbformat": 4,
"nbformat_minor": 4
}