def test_warpcraters(self): # Not the real image dimensions, but whatever imgdim = [250, 300] ilong = self.craters["Long"].as_matrix() ilat = self.craters["Lat"].as_matrix() res = self.oproj.transform_points(x=ilong, y=ilat, src_crs=self.geoproj)[:, :2] # Get output x, y = mkin.coord2pix(res[:, 0], res[:, 1], self.oextent, imgdim, origin="upper") ctr_sub = mkin.WarpCraterLoc(self.craters, self.geoproj, self.oproj, self.oextent, imgdim, llbd=None, origin="upper") xy_gt = np.r_[x, y] xy = np.r_[ctr_sub["x"].as_matrix(), ctr_sub["y"].as_matrix()] self.assertTrue(np.all(np.isclose(xy, xy_gt, rtol=1e-7, atol=1e-10)))
def test_pctoortho(self): imgo, imgwshp, offset = mkin.WarpImagePad(self.img, self.iproj, self.iextent, self.oproj, self.oextent, origin="upper", rgcoeff=1.2, fillbg="black") ctr_xy = mkin.WarpCraterLoc(self.craters, self.geoproj, self.oproj, self.oextent, imgwshp, llbd=None, origin="upper") ctr_xy.loc[:, "x"] += offset[0] ctr_xy.loc[:, "y"] += offset[1] Cd = 1. pxperkm = mkin.km2pix(imgo.size[1], self.llbd[3] - self.llbd[2], \ dc=Cd, a=1737.4) ctr_xy["Diameter (pix)"] = ctr_xy["Diameter (km)"] * pxperkm imgo2, ctr_xy2 = mkin.PlateCarree_to_Orthographic(self.img, None, self.llbd, self.craters, iglobe=self.iglobe, ctr_sub=True, origin="upper", rgcoeff=1.2, dontsave=True, slivercut=0.) imgo = np.asanyarray(imgo) imgo2 = np.asanyarray(imgo2) self.assertTrue( np.all( np.isclose(imgo.ravel(), imgo2.ravel(), rtol=1e-6, atol=1e-10))) self.assertTrue(ctr_xy.equals(ctr_xy2))
def MakePCOTransform(img, oname, llbd, csvname): """Almost identical to make_input_data.PlateCarree_to_Orthographic, except designed to test relevant loading times when creating large datasets. """ origin = "upper" rgcoeff = 1.2 ctr_sub = True iglobe = ccrs.Globe(semimajor_axis=1737400, semiminor_axis=1737400, ellipse=None) craters = pd.read_csv(csvname, sep=',', header=0, engine="c", encoding="ISO-8859-1") # Set up Geodetic (long/lat), Plate Carree (usually long/lat, but # not when globe != WGS84) and Orthographic projections geoproj = ccrs.Geodetic(globe=iglobe) iproj = ccrs.PlateCarree(globe=iglobe) oproj = ccrs.Orthographic(central_longitude=np.mean(llbd[:2]), central_latitude=np.mean(llbd[2:]), globe=iglobe) # Create and transform coordinates of image corners and # edge midpoints. Due to Plate Carree and Orthographic's symmetries, # max/min x/y values of these 9 points represent extrema # of the transformed image. xll = np.array([llbd[0], np.mean(llbd[:2]), llbd[1]]) yll = np.array([llbd[2], np.mean(llbd[2:]), llbd[3]]) xll, yll = np.meshgrid(xll, yll) xll = xll.ravel() yll = yll.ravel() # [:,:2] becaus we don't need elevation data res = iproj.transform_points(x=xll, y=yll, src_crs=geoproj)[:, :2] iextent = [min(res[:, 0]), max(res[:, 0]), min(res[:, 1]), max(res[:, 1])] res = oproj.transform_points(x=xll, y=yll, src_crs=geoproj)[:, :2] oextent = [min(res[:, 0]), max(res[:, 0]), min(res[:, 1]), max(res[:, 1])] imgo, imgwshp, offset = mkin.WarpImagePad(img, iproj, iextent, oproj, oextent, origin=origin, rgcoeff=rgcoeff, fillbg="white") # Convert crater x, y position if ctr_sub: llbd_in = None else: llbd_in = llbd ctr_xy = mkin.WarpCraterLoc(craters, geoproj, oproj, oextent, img.size, llbd=llbd_in) # Shift crater x, y positions by offset # (origin doesn't matter for y-shift, since # padding is symmetric) ctr_xy.loc[:, "x"] += offset[0] ctr_xy.loc[:, "y"] += offset[1] imgo.save(oname) ctr_xy.to_csv(oname.split(".png")[0] + ".csv", index=False)