415 lines
130 KiB
Plaintext
415 lines
130 KiB
Plaintext
|
|
{
|
||
|
|
"cells": [
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 1,
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stderr",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"/home/dlsaavedra/anaconda3/envs/new/lib/python3.7/site-packages/pysal/__init__.py:65: VisibleDeprecationWarning: PySAL's API will be changed on 2018-12-31. The last release made with this API is version 1.14.4. A preview of the next API version is provided in the `pysal` 2.0 prelease candidate. The API changes and a guide on how to change imports is provided at https://migrating.pysal.org\n",
|
||
|
|
" ), VisibleDeprecationWarning)\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"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": {},
|
||
|
|
"source": []
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 2,
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"#path_T = \"Thermo.tif\"\n",
|
||
|
|
"#path_String = \"Thermo_String_PV01.tif\"\n",
|
||
|
|
"\n",
|
||
|
|
"path_T = \"Pampa/THERMAL_06.tif\"\n",
|
||
|
|
"path_String = \"Pampa/BP-B-5.tif\"\n",
|
||
|
|
"ZonaPV = 'BP-B-5'\n",
|
||
|
|
"path_kml_panel = 'Pampa/KML/Paneles_' + ZonaPV +'.kml'\n",
|
||
|
|
"path_kml_mesa ='Pampa/KML/Mesa_' + ZonaPV +'.kml'\n",
|
||
|
|
"\n",
|
||
|
|
"panel_size = (29 , 50)\n",
|
||
|
|
"#panel_size = (37 , 17) #weight, height size#\n",
|
||
|
|
"#panel_size = (20 , 35)\n",
|
||
|
|
"overlap = 0\n",
|
||
|
|
"order_top_bottom = False # order top bottom or right left\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"GR_String = gr.from_file(path_String)\n",
|
||
|
|
"GR_T = gr.from_file(path_T)\n",
|
||
|
|
"\n",
|
||
|
|
"\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",
|
||
|
|
" 'T':0}\n",
|
||
|
|
"\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",
|
||
|
|
" 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",
|
||
|
|
"\n",
|
||
|
|
" split_Weight = max(split_Weight, 1)\n",
|
||
|
|
" split_Height = max(split_Height, 1)\n",
|
||
|
|
" 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",
|
||
|
|
" 'T' : 0,\n",
|
||
|
|
" 'severidad': 'default'} \n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"metadata": {},
|
||
|
|
"source": []
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 3,
|
||
|
|
"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",
|
||
|
|
" 'T': 0, \n",
|
||
|
|
" 'severidad': 'default'}\n",
|
||
|
|
" \n",
|
||
|
|
" string_coord['panels'][panel_key] = panel_coord\n",
|
||
|
|
" \n",
|
||
|
|
" L_strings_coord[string_key] = string_coord\n",
|
||
|
|
"\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"# Display image"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 4,
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 432x288 with 0 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 1152x1152 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {
|
||
|
|
"needs_background": "light"
|
||
|
|
},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"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",
|
||
|
|
"string = L_strings_coord['22']\n",
|
||
|
|
"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",
|
||
|
|
"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",
|
||
|
|
"#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",
|
||
|
|
"execution_count": 5,
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"Listo\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"\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",
|
||
|
|
" pmt = kml.newpolygon(name= string['id'], outerboundaryis = points)\n",
|
||
|
|
" pmt.extendeddata.newdata(name='Mesa', value=string['id'])\n",
|
||
|
|
"\n",
|
||
|
|
"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",
|
||
|
|
" \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": [
|
||
|
|
"\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"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
|
||
|
|
}
|