{ "cells": [ { "cell_type": "markdown", "id": "3d69fb49-40d3-436f-938a-06fff713d5cb", "metadata": {}, "source": [ "## Example 1" ] }, { "cell_type": "code", "execution_count": 1, "id": "cheap-poland", "metadata": {}, "outputs": [], "source": [ "from math import ceil\n", "import pystare as ps\n", "\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import matplotlib.tri as tri\n", "import cartopy.crs as ccrs\n", "\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "id": "respected-belgium", "metadata": {}, "outputs": [], "source": [ "def shiftarg_lon(lon):\n", " \"If lon is outside +/-180, then correct back.\"\n", " if(lon>180):\n", " return ((lon + 180.0) % 360.0)-180.0\n", " else:\n", " return lon\n", "\n", "def triangulate(i0,i1,i2):\n", " \"Prepare data structures for tri.Triangulate.\"\n", " print('triangulating...')\n", " # i0,i1,i2,ic = ps.to_vertices(indices)\n", " i0lat,i0lon = ps.to_latlon(i0)\n", " i1lat,i1lon = ps.to_latlon(i1)\n", " i2lat,i2lon = ps.to_latlon(i2)\n", " lats = np.zeros([3*len(i0lat)],dtype=np.double)\n", " lons = np.zeros([3*len(i0lat)],dtype=np.double)\n", " intmat = []\n", " k=0\n", " for i in range(len(i0)):\n", " lats[k] = i0lat[i]\n", " lons[k] = i0lon[i]\n", " lats[k+1] = i1lat[i]\n", " lons[k+1] = i1lon[i]\n", " lats[k+2] = i2lat[i]\n", " lons[k+2] = i2lon[i]\n", " intmat.append([k,k+1,k+2])\n", " k=k+3\n", " for i in range(len(lons)):\n", " lons[i] = shiftarg_lon(lons[i])\n", " print('triangulating done.') \n", " return lons,lats,intmat\n", "\n", "def triangulate1(lats,lons):\n", " \"Prepare data for tri.Triangulate.\"\n", " print('triangulating1...')\n", " intmat=[]\n", " npts=int(len(lats)/3)\n", " k=0\n", " for i in range(npts):\n", " intmat.append([k,k+1,k+2])\n", " k=k+3\n", " for i in range(len(lons)):\n", " lons[i] = shiftarg_lon(lons[i])\n", " print('triangulating1 done.') \n", " return lons,lats,intmat\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "allied-queen", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "lat len: 3\n", "indices len: 3\n", "indices: ['0x3d7e69d09dbc425b', '0x4f787e76173d57b', '0x3601d08443fdaf7b']\n", "triangulating...\n", "triangulating done.\n", "triangulating done.\n", "triangulating done.\n", "test1 intmat len: 1\n", "test1 lats: [ 1.75738915e-07 -1.15917097e-07 6.00000003e+01]\n", "test1 lons: [ 0. 60.00000009 30.00000003]\n", "test1 intm: [[0, 1, 2]]\n", "0 hull len: 80\n", "lath,lathc: 240 80\n", "triangulating1...\n", "triangulating1 done.\n", "0 hull len: 80\n", "0 hull lats len: 240\n", "0 hull lats1: 18 [58.60028538 65.58484188 59.74568674]\n", "0 hull lons1: 18 [28.67505114 22.7923471 17.91494647]\n", "\n", "resolution: 4\n", "hull len: 80\n", "hull ll len: 240\n", "hull im len: 80\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAAC1CAYAAAD86CzsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAB5RElEQVR4nO2ddXgUVxfG3904cVmLQAgEAkGCuzsFAhQvxSnWlkJpi7TwYcXdrdBCgVLci7a4FddCEgIJECHu2Z33+2PZJUuE+Cawv+e5T3Zn7tw5M9l99865954jIgkDBgwYMFA4iPVtgAEDBgx8TBhE14ABAwYKEYPoGjBgwEAhYhBdAwYMGChEDKJrwIABA4WIsb4NMPDhIRKJzACUAVAaQEkALiKRSGFtbe1qZmZma2xsXEIsFpuLRCLTN8WEpPGbYkRSLAiCmKRYJBJBLBZDpEbnNUlQDQRBwJu/JAmRSESRSCSIxWKVWCwWACjflFSSqSSTBUFIVqlUiSkpKXExMTFBgiC8ABAMIAhAAIAnJGP1dBsNfKCIDFPGDGSHN0JaGUAVAOUtLCzK29vblzUyMpIJgmCpVCpNxGKx2NjYGKampiIHBwdKJBLIZDKRXC6HTCYTOTk5wdLSEubm5jAzM9OWd99rtpmamkIkEuXYVpJITU1FcnIykpOTkZSUpH2d0bbExESEh4cjNDQUr169YkhICEJDQ/n69WskJSVBqVRCpVLR2Ng41cjIKFGlUoXHxMT4x8bGPgLwH4C7AG6SjM7Xm27gg8QgugYAACKRyBZAfQC1zM3NfRwcHCqLxWKZUqm0MDIyEpubm4sUCgXd3d1FHh4eInd3d7i4uMDZ2RlSqRT29vYwMTFJ1y5JJCQkwN/fH/7+/nj48CFkMhns7e1Rt25dyGQyAIBKpcKtW7dw9+5dBAUF4dmzZzA2NoZEIkHPnj3h5eVVuDfkHQRBQFRUFMLCwvDixQsEBwfj2bNn8Pf3Z0BAAIODg5GQkIDU1FQaGRkli0Si8Ojo6AexsbE3AfwL4BzJl3q9CANFAoPofkS86a02AdDEzs6ugbW1dQWlUmknEomMraysUKZMGVSsWFFcoUIFlClTBqVLl4azs3OGYpoRISEhOHv2LOLi4nDs2DH4+fnh4cOHiImJgbu7O2JjY/H69WttfScnJ4SHh8Pe3h6RkZFwcXFBkyZNYGlpiXXr1um03apVK3zzzTdo3759nu6BUqmESCSCkZFRtuonJyfjxo0bqFixImxsbN5bX6VSITQ0FE+fPoW/vz/u37/P+/fv4/Hjx4yKioJKpRJMTExikpKS/MPDw8+TPAvghKGX/PFgEN0PEJFIZAKgpUgkaiOVSpuYmpqWTk1NtTI3Nxd5enqievXqYh8fH5QvXx5lypTJlphoEAQBKpVKK8RnzpzBkiVL8O+//yIwMFCn7rx58xAbG4sTJ07gwoUL2u21a9dG9+7dUb9+fQQHB6N06dK4c+cOBgwYAI2vdvfu3dizZw9+//137XHz58/Ht99+m86m//77Dxs3bsSxY8dw/fp1AICnpycePXqk457o378/fvvtN+11ZMd1ERERAUdHR+17X19fdO7cGW3atIGNjQ0sLS2zc9u0JCUlISAgAI8ePcLt27dx/fp13r9/H7GxsTQ2Nk4UBCEoNDT0vFKpPA7gkMGn/AHyZjDCUIppASADMNzc3HyXq6trsFwuTylZsqTQunVr1dSpU7l//34+fvyYSqWS2UUQBKpUKj5+/Jg//fQTAbBr165s3LgxAWhLq1atdN4DoIuLi/a1lZUVTU1NKRKJKJfLGRUVlW0bSPLUqVMEwP79+zMlJSXTej///DMBsHr16jq2PHr0SKdeVFQUly9fzn379uXIjmvXrnHevHmUyWTprhcAFQoFnz17RpVKlaN20yIIAp8/f85jx45x/vz57Nq1q1CmTBlBLpcr3dzcwmxsbI4B+AFAWRaBz52h5L4YerrFCJFIZAGgi7m5eScnJ6cmSqVSYmtrK6pdu7aofv36omrVqqFSpUo56n0lJSXh8uXL+PXXX7F582YolUoAgLOzM168eAEAcHNzQ5UqVXD+/HlERUUBAExNTZGSkpKuvfr162t7tZ9++ilWrFgBqVSa4wGxU6dOoUWLFpg3bx7GjRuXZV1BELBs2TJ88803AABLS0vEx8fj+vXrqFatWo7OCwDPnz/H3r17kZiYiGHDhsHW1lbnXMHBwXjy5AlevHiByZMnIzU1FRKJRHu+atWqwc3NDV5eXvDx8UG5cuUgFmc9O1PT8373PqWmpuLhw4e4efMmLl68yAsXLjAkJATGxsbR0dHRl2NjY/cD2EkyLMcXakA/6Fv1DSXzAqCcWCyeIZfL7ysUimR3d3dVly5dhGXLlvHq1atMSkpiXpFIJBn23rJb5HI5S5cuTTc3NyYkJHDYsGE6+/fv358nu54/f57tY65du8ZJkybx1atXjIuLy9V5R4wYQQcHB639mzdvzrL+7t27da53ypQpbNasGb29vdm1a1d6eHjQ3t6eAwcO5KtXrzJtJ20bZcqUYePGjWlhYcFPP/2Uq1evZkxMjLauUqnkvXv3uGHDBvbr108oV66cSi6Xp7q4uAQaGRmtAFCXReDzaygZF0NPtwghEolqGhsbD5XJZB1UKpVMKpWKWrZsKW7ZsiXq1asHOzu7XLft7++PVatW4fz584iNjYWRkRGOHTumnT2QlmrVqsHFxQUHDx7Mss2mTZvixIkTOoNSmg9WamoqrKyssG3bNnTr1i3bdqpUKqxYsQKjR4/G1q1b0bt37+xfZB5RKpUwMTFBt27dcOLECZw+fRo+Pj6Z1o+NjdX6w3/++WeMGTMG5ubm6eoFBwdj8ODBiIqKQu3atVGpUiWIRCKULFkSFSpUwOPHj/HgwQPcv38ff//9Nx48eJCujUaNGuHvv//OtMecmJiIa9eu4fTp0zh69KgQEBAAY2PjqIiIiNMJCQkbAByl4cteNNC36n/MBYCXkZHRYhcXl+cymUxZu3ZtYcaMGbx06RKTk5OZF5RKJc+dO8dx48bR3t4+W71WExOTbPdwe/Xqlem5BUHghAkT2L59e75ZrJAtrl69qtN+ampqnu5Bbpg6dSpdXFzo4OCQrpcdGBhIhULBTp060cnJiSVLltTaO2bMmCzbDQsL45o1a/j1119rj2nZsiUdHR117muJEiVYq1YtTp8+nS9fvuT27du1+0QiEUeNGsW5c+fy119/5dGjR/nkyZMM77FKpeKdO3e4fPlytmzZUpDL5So3N7dwCwuL3wA0ZBH4/H+sRe8GfEwFgAWAryUSyV1HR0dllSpVVJMmTeLZs2e1IhsfH88bN25w//79bN68OZcuXZoj4SLJ5OTkDIWyRYsWnDRpko5YAGDNmjUzrN+2bVuePXuWo0eP5rRp0wiAUqmUADhx4sRMz1+tWjUC4P3797Nt861bt1i/fn0C4LFjx3J0ve/j/v37/PPPP7lu3ToGBARkWffRo0c692DhwoWMj48nSSYmJtLV1ZW1atXK8H79888/ObYtJSWFfn5+PHv2LMPCwpiYmMiTJ09y+PDhtLa2po+PT4bn+uyzz9iyZUu6uLjQ1dWVPXr04OzZs3ns2DGeOHGCe/fu5ZUrV5iYmEhSLcI3b97k3LlzWb9+fZVMJlMpFIpAkUg0DYCMReD78bEUvRvwoRcAVS0sLLa6urpGu7i4CKVLl2bDhg25Zs0aCoLAW7ducc6cOezUqRM9PDxobm7OChUqsFmzZtovmJubGz///HPOmDGDKSkpjIiI4KVLl3jw4EFOnDhR58vo5eXFv//+mwBobGys3V6jRg1q+O+//+jk5MS6dety4MCBLFOmjE49zevp06dz1apV7NKlC0NCQkiSL1++ZO3atQmAgYGBfJf58+drj7979266/RkRHByscw1p/Zd5Ye/evfT19aWjoyN9fX3Zp08fAqBEIuGVK1cyPe7ff//lpEmTtPYsXbqUCQkJXL9+PSdMmKAVvbQ2v379Ok+zFzIiLi6Ohw4doqenJwFw8ODB7NGjB7dv366tIwgC//vvP27evJljxoxhkyZN2KxZM3bo0IE+Pj4sUaIE27Rpw/Xr1/PcuXM8evQor1y5wl69elEsFtPBwYFSqVSQyWRJtra2JwC0ZRH43nzIRe8GfGgFgAhAZzs7u4symSylatWqqjlz5vDhw4eMjo7m6tWr2adPH7Zs2ZIODg4sXbo0R40axT/++IMPHz5MNzUqJCSEhw4d4pw5c7RfcE0PqHnz5hwxYkSWbgCpVEpTU1OWKFGC5cuXp6+vr3Yql6aOu7u79vWXX36pdTOk7dXt2rWLJHny5El6eXmxfPny2l6UBqVSqXPurHroSUlJDAwM5KFDh9ivXz/tMbdu3cr0mJywaNEiuru7c8uWLbx+/bp2+969e1mvXj2WLFmSDg4ObNSoEVesWMHw8HA+fvyYc+fO1f5YREVFceLEiRw/frx2WlpWZdy4cTl+KiloYmJiuH37dvbs2ZMVK1Zk06ZN002tA8BGjRrR3d2dDg4OtLGxUclksnsAhgMwYRH4Xn1IRe8GfAjljdB+LpPJ7kokEpVCoaCtrS3Pnz9PDdevX2f16tXZsGFD/vLLLzx8+DCDg4OZEx4/fsxLly5l6escOHCgzpfJyMiILVu21L5/17UwZcoUnRkHjRs3po2NDbt06UI7Ozvt9tWrV5MkT5w4oX3sTktwcDAbNWrEWrVqceXKlZnaqFQqOWfOHNrZ2VGhULBFixacNWtWju9FVqxYsYLlypXT6YlPnEhWqqT+S6p7iCEhITx48CB79+5NW1tbVq1aVeeJwcrKSitQNWvWZNeuXTlw4ECmpKTwxIkTbNeuHQHw+PHjbNSoEQGwTZs2RU54MyM1NZUXL17kjBkztE8XKpWKt2/f5v79+9mzZ09BLperXFxcgsRi8Q8AzFgEvm/FvejdgOJa3ghtf4lE8kgmk6k6duwovOtz+/bbb7XvbW1tuXr16nx/BH2XiIgIHjt2jEeOHOFXX33Fx48fk1SL3enTp3n16lX26tWL69evJ0n6+/uzQoUKBEB7e3s6OztzwYIFvHPnDkUiEa2srNipUydu2bKFAwcOZGBgIBs2bEgAjIyMJKn+ojZq1IjdunXLcBGGSqXirVu3uGLFClarVo2NGjWin5+fdv+DBw84ZMgQzp8/n9OnT+f3339PW1tbvnz5MsfXHxYWRicnJz58+FC7beJEErhH4AwBQSu8mt5ro0aN0rlpALBp06Y5OrfGl/3vv//m2O6iilKp5N9//82BAwcKCoVC5eLiEiwWi8cbBDgP2qFvA4pbAdDcwcHhqrW1taDpCfbp04eurq4EQHNzc+2XtkWLFgTU8y7TikBRIDAwkB06dNDaunz5cu7cuZN9+vShi4sL7ezsWKtWLd66dYtRUVFaN4SxsTF9fHx0Bo2eP39OS0vLDOcNL1iwgHZ2dvT09GTfvn155MiRdMKssaFSpUocNmwYx40bR3d3d/bt2zfH1/X555/zm2++0dlWuvQZAk5vzjOMcjl58SL57Fmoju8cAC0tLfnTTz/x2bNnOe6x3r17l9OnT8/R6r/ihFKp5JkzZzho0CBBLperZDLZEwD98SacgKFkU0P0bUBxKABKWVlZ7ZLL5cl169ZVTZ8+Xfs4aW9vz9mzZ/PRo0c6gy8AOGzYMBYlHj58yBEjRug8RmvKd999x44dO2rfOzo6Mj4+nvv376dKpaKDgwPXrl3Lffv2peutjx8/ngMHDtTZJggCV69ezTJlyvDJkydZ2qXxKS9ZsoQbNmxg+/bt6ejomKOFFSqVilOnTmW5cuXSLYyoWnUkATcCjgR2slo1slo10sKCrF5dSam0tva6PTw8OH68UscVYSA9MTExBEA7Ozva2dmpHB0dL8GwKCN7eqJvA4pqAWAkFovHubi4hJUuXVqYM2eOdkXRf//9p/2SfvHFFyxVqhQB0NPTkx06dODKlSuZkJDAokBKSgq3bt3Kjh070snJiVOnTmXPnj219ltZWREAf/zxR54/f54nT57kjh07CID79u3TClGjRo0ydY307t2bmzZt0r4PCgpi/fr16e3tna0e/osXLzhu3Dh+9tln7NGjB7du3ZqjGQxnz55l5cqVWb9+/XQuiZkzZ9LZ2ZNGRqVob7+BADlihHpffDx5/jw5f76SzZqdpovLDZqZqb8VmmIQ3reEhYVx+vTpDAsL024LCAjgggUL6O3tTVtbW9rb2yeZmpouA2DLIvA9LopF7wYUtQKgooODwxmZTKbq27evcPnyZZ3HzOTkZE6aNIlyuZwVK1bkhAkTePPmTW0wF0EQeP78ed65c4f6JCUlhevWrWPJkiXZrFkzbt26lUFBQSTf9lIsLCwIgDY2Nvz000/p5eVFADx79ixnz55NJycnGhkZcevWrVn+iAwZMoTLly8nqb7+YcOGsV+/foXymC0IAh0cHPjHH39k6A6oWrUqe/W6zKpVP+OUKVO4eLH6U//zz28qqFTkq1ekIDAggDqCC6gH3z52YmNj2atXL+3nQzMA++4ThWZg0cbGhgqFQpDJZA8BtGYR+F4XpaJ3A4pCASAyMjL60tnZOdzT01NYtWoVY2NjqSE6Oppjxozh8OHDCYBdunThvXv3tPsFQeDVq1fp5uaW7rH9wIEDDA0NZWFy7tw5VqhQgc2bN+fFixczrXfz5k06ODjwwIED2m22trYEQKVSyT179vDmzZvvPd///vc/rQ/7u+++Y5UqVRgREZEv15Id3N3d+d9//2W4r3LlfhSJ2rNZs310dXXl4cOH2b79FgJD2aL5CD4HqBIZsYXd1XSCa+jpqtH49J2cnLTCa2Jiwh49elAQBD579owLFy7UfuavXr3K1NRU7t69m3Xq1BEUCkWCiYnJAgAWLALfd30XvRug14sHrEuUKPGrTCZL7dKli3Dp0qUMe0u7du3SEdJdu3bx1atXTElJ0a7USlt8fHy4a9cu/vjjj2zQoAEBFJrw/vTTTyxRogR37tyZ6UCQIAj8/fff6ebmxjlz5mi3BwUF0cjIiH/++afWv7tq1ar3nlMQBMbHx/OLL75gt27dcjXrIC988skn/PPPPykIAqdOncrdu3eT1MxaiCNQmsARAtvS/a88MEorsMt/jtYeZ2FB5mIc74PgypUr/N///sehQ4dqpyCWL19ee8969erFly9fsk6dOuzWrZt2u2Y6ore3t057jx8/5qhRoyiXy1X29vanALizCHz/9VX0boBeLhrwkkgkl+VyuWrChAnZEgmN3zZtcXBwYMuWLTlnzhz26tWL165dS/dIHRISQkC9zv7q1avvPU9eEASBANihQ4cs6z148IB2dnY8c+aMzvaLFy8SUC++mDBhAqtVq6Yz11ifPHz4UDsz5N3e94oVK+jl5cX27duzatWqNDIy4qtXr1ipEgnMJ1CZQBxtbUkTE800vu0EzhIQCJDu8Oe+rXHU/E6VLk2WKEF261b416pvRowYQW9vb65atYo///wzp06dyn379rFevXoEwBFvnOIRERGUSCSsXbs269atS19fX164cCFTV1RsbCyXLl3KUqVKCXK5PABASxYBPSjsoncDCvVigYZyudzP3d1dWLduXboVVe+iWaY7cuTIdIKrGXx6H4IgaFdcFbToaoJ+d+nSJcswguvWrWPr1q0z3Hfs2DGGh4czNTWVcrmcT58+LShzc8Tnn3+uXR3n5uams08QBO7du5eff/659n8zYsSINz3dGQQmECD79buQ5v+3MUN3QkblYxPeFy9e0NHR8b2zTkhy+vTpBMALFy5w6tSp9PHxoUQi4bx58zL9fqlUKh48eJDVqlUTFApFBIDPWQT0obCK3g0olIsEOioUihBvb29hz549WS5QCAoK4s8//5xuWpWTkxOXLl3KKlWqcN68edmO83rt2jUqFIpcBUPJKUFBQdy8eTMHDBjABg0apOtxJCQkaAfI0i6NzYjp06fT2Ni4yMw5bdu2Lfv378+qVavSx8cnwzqdO3emQqGgZr70999/TxsbNzo5LaGNDbl+/QZ26uRLYCGBAP6LahwA9YyGksZBFCDi0RoTaWyk0hFdB4dCvtgiwMSJEzlq1Khs1d25cycdHR05c+ZMpqSk8O7du9pAPS9evMjy2IsXL7JZs2aCXC5PEIvF37AI6EVBF70bUKAXB3SSy+XhNWrUEE6fPp2pj3Pz5s0sXbp0up5slSpVuGvXrlyHGExOTqZCoeCsWbNydXxuiYyMZPv27bXXceHCBY4ePZoKhYK+vr709/d/bxua3s4XX3yRL8HSc8vz58/ZoUMH7eKTn376iTY2NjoDmRrGjRtHzQIHQB0KccmSJdyx408aG8+lSDSUgB0B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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Make a triangle's lat & lon corners\n", "# lat = np.array([0, 0,60], dtype=np.double)\n", "# lon = np.array([0,60,30], dtype=np.double)\n", "lat = np.array([0, 0,60], dtype=np.double)\n", "lon = np.array([0,60,30], dtype=np.double)\n", "\n", "# Make the indices out of the corners\n", "s_resolution = 27\n", "indices = ps.from_latlon(lat, lon, s_resolution)\n", "print('lat len: ',len(lat))\n", "print('indices len: ',len(indices))\n", "print('indices: ',[hex(i) for i in indices])\n", "\n", "# Prepare to triangulate the indices (as locations)\n", "def test1(indices):\n", " \"Plot the outline of a triangle using first three indices.\"\n", " i0 = np.array([indices[0]], dtype=np.int64)\n", " i1 = np.array([indices[1]], dtype=np.int64)\n", " i2 = np.array([indices[2]], dtype=np.int64)\n", " lons,lats,intmat = triangulate(i0,i1,i2)\n", " print('test1 intmat len: ',len(intmat))\n", " print('test1 lats: ',lats)\n", " print('test1 lons: ',lons)\n", " print('test1 intm: ',intmat)\n", " return lons,lats,intmat\n", " # triang = tri.Triangulation(lons,lats,intmat)\n", " # print('test1 triang : ',triang)\n", " # return triang\n", "\n", "# Set up the projection and transformation\n", "# proj = ccrs.PlateCarree()\n", "# proj = ccrs.Robinson()\n", "# proj = ccrs.Geodetic()\n", "# proj = ccrs.Geodesic()\n", "proj = ccrs.Mollweide()\n", "transf = ccrs.Geodetic()\n", "# transf = ccrs.PlateCarree()\n", "\n", "plt.figure()\n", "plt.subplot(projection=proj,transform=transf)\n", "# ax = plt.axes(projection=ccrs.PlateCarree())\n", "# ax = plt.axes(projection=ccrs.Mollweide())\n", "# proj=ccrs.Mollweide()\n", "ax = plt.axes(projection=proj,transform=transf)\n", "ax.set_global()\n", "# ax.set_xlim(-180,180)\n", "# ax.set_ylim(-90,90)\n", "# ax.set_xlim(-1,1)\n", "# ax.set_ylim(-1,1)\n", "ax.coastlines()\n", "# plt.contourf(xg,yg,v0g,60,transform=ccrs.PlateCarree())\n", "# plt.scatter(xg_flat,yg_flat,s=300,c=v_flat)\n", "# plt.triplot(triang,'ko-')\n", "# plt.show()\n", " \n", "def plot1(triang):\n", " # plt.triplot(triang,'ro-',transform=ccrs.Geodetic())\n", " plt.triplot(triang,'r-',transform=transf)\n", " # plt.show()\n", " return\n", "\n", "test1_lons,test1_lats,test1_intmat = test1(indices)\n", "plot1(tri.Triangulation(test1_lons,test1_lats,test1_intmat))\n", "plt.scatter(test1_lons,test1_lats,s=5,c='r',transform=ccrs.PlateCarree()) \n", "\n", "# resolution = 2;\n", "resolution = 4;\n", "# resolution = 7;\n", "# hull = ps.to_hull_range(indices,resolution,100)\n", "hull = ps.to_hull_range_from_latlon(lat,lon,resolution)\n", "print('0 hull len: ',len(hull))\n", "\n", "# print(90)\n", "# lats0 = np.zeros(len(hull)*4,dtype=np.int64)\n", "# lons0 = np.zeros(len(hull)*4,dtype=np.int64)\n", "# lats0,lons0 = ps._to_vertices_latlon(hull)\n", "# print('lats0,lons0: ',len(lats0),len(lons0))\n", "# print(100)\n", "lath,lonh,lathc,lonhc = ps.to_vertices_latlon(hull)\n", "print('lath,lathc: ',len(lath),len(lathc))\n", "# print(110)\n", "lons1,lats1,intmat1 = triangulate1(lath,lonh)\n", "\n", "## h0,h1,h2,hc = ps.to_vertices(hull)\n", "## lons1,lats1,intmat1 = triangulate(h0,h1,h2)\n", "\n", "print('0 hull len: ',len(hull))\n", "print('0 hull lats len: ',len(lats1))\n", "jtest=18\n", "j=jtest\n", "print('0 hull lats1: ',j,lats1[j*3:(j+1)*3])\n", "print('0 hull lons1: ',j,lons1[j*3:(j+1)*3])\n", "j=0\n", "# print('0 hull lats1: ',[i for i in lats1[j:j+12]])\n", "# print('0 hull lons1: ',[i for i in lons1[j:j+12]])\n", "print('')\n", "\n", "# tid = np.array([0x4c0000000000003],dtype=np.int64)\n", "# t0,t1,t2,tc = ps.to_vertices(tid)\n", "# print('t0: ',hex(t0[0]))\n", "# print('t1: ',hex(t1[0]))\n", "# print('t2: ',hex(t2[0]))\n", "# print('tc: ',hex(tc[0]))\n", "# print('t0 ll : ',ps.to_latlon(t0))\n", "# print('t1 ll : ',ps.to_latlon(t1))\n", "# print('t2 ll : ',ps.to_latlon(t2))\n", "# print('tc ll : ',ps.to_latlon(tc))\n", "# print('')\n", "\n", "if False:\n", " # i=9; ilen=2\n", " # i=10; ilen=1\n", " # i=jtest; ilen=4\n", " i=jtest; ilen=10\n", " id_test = np.array(hull[i:i+ilen],dtype=np.int64)\n", " print('i,id : ',i,[hex(j) for j in id_test])\n", " i0=i*3; i1=(i+ilen)*3\n", " lats1 = lats1[i0:i1]\n", " lons1 = lons1[i0:i1]\n", " # intmat1 = [intmat1[i]]\n", " intmat1 = []\n", " for j in range(ilen):\n", " intmat1.append([3*j,3*j+1,3*j+2])\n", " # intmat1 = [[0,2,1]]\n", " id_test_lats,id_test_lons,id_test_latsc,id_test_lonsc = ps.to_vertices_latlon(id_test)\n", " lonstest,latstest,intmattest = triangulate1(id_test_lats,id_test_lons)\n", " # i0test,i1test,i2test,ictest = ps.to_vertices(id_test)\n", " # print('test id: ',[hex(i) for i in id_test])\n", " # print('test ll : ',[(lats1[i],lons1[i]) for i in range(len(lats1))])\n", " # print('test im : ',[i for i in intmat1])\n", " # lonstest,latstest,intmattest = triangulate(i0test,i1test,i2test)\n", " print('test lat: ',len(latstest))\n", " print('test lon: ',len(lonstest))\n", " print('test im: ',len(intmattest))\n", " print('test im[0]: ',intmattest[0])\n", " print('test im: ',intmattest) \n", " triangtest = tri.Triangulation(lonstest,latstest,intmattest)\n", " plt.triplot(triangtest,'g-',transform=transf)\n", " plt.scatter(lonstest,latstest,s=5,c='g',transform=ccrs.PlateCarree())\n", " # plt.triplot(triangtest,'go-',transform=ccrs.Geodetic())\n", " # plt.scatter(lonstest,latstest,s=10,c='g',transform=ccrs.Geodetic())\n", "\n", "print('resolution: ',resolution)\n", "# print('hull : ',[hex(i) for i in hull])\n", "print('hull len: ',len(hull))\n", "print('hull ll len: ',len(lons1))\n", "print('hull im len: ',len(intmat1)) \n", "# print('hull ll : ',[(lats1[i],lons1[i]) for i in range(len(lats1))])\n", "# print('hull im : ',[i for i in intmat1])\n", "\n", "triang1 = tri.Triangulation(lons1,lats1,intmat1)\n", "plt.triplot(triang1,'b-',transform=transf,lw=1,markersize=3)\n", "plt.scatter(lons1,lats1,s=10,c='b',transform=ccrs.PlateCarree())\n", "# # plt.contourf(xg,yg,v0g,60,transform=ccrs.PlateCarree())\n", "\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.10" } }, "nbformat": 4, "nbformat_minor": 5 }