def testEncodeSectorMatchingUSCG(self): msg = '!AIVDM,1,1,0,A,85M:Ih1KmPAW5BAs80e0EcN<11N6th@6BgL8,0*13' sub_area_msg = msg.split(',')[5][-16:] sa1_bits = binary.ais6tobitvec(sub_area_msg) sa1 = AreaNoticeSector(bits=sa1_bits) scale_factor = 100 lon = -71.7516666667 lat = 41.116666666 precision = 2 radius = 5000 left = 175 right = 225 self.checkSector(sa1, scale_factor, lon, lat, precision, radius, left, right) sa2 = AreaNoticeSector(lon, lat, radius, left, right, precision, scale_factor) self.checkSector(sa2, scale_factor, lon, lat, precision, radius, left, right) sa2_bits = sa2.get_bits() sa3 = AreaNoticeSector(bits=sa2_bits) self.checkSector(sa3, scale_factor, lon, lat, precision, radius, left, right) self.assertEqual(sa1_bits, sa2_bits)
def testEncodeRectMatchingUSCG(self): msg = '!AIVDM,1,1,0,A,85M:Ih1KmPAVhjAs80e0;cKBN1N:W8Q@:2`0,0*0C' sub_area_msg = msg.split(',')[5][-16:] sa1_bits = binary.ais6tobitvec(sub_area_msg) sa1 = AreaNoticeRectangle(bits=sa1_bits) scale_factor = 10 lon = -71.91 lat = 41.1416666667 precision = 4 e_dim = 400 n_dim = 200 orientation_deg = 42 self.checkRectangle(sa1, scale_factor, lon, lat, precision, e_dim, n_dim, orientation_deg) sa2 = AreaNoticeRectangle(lon, lat, e_dim, n_dim, orientation_deg, precision, scale_factor) self.checkRectangle(sa2, scale_factor, lon, lat, precision, e_dim, n_dim, orientation_deg) sa2_bits = sa2.get_bits() sa3 = AreaNoticeRectangle(bits=sa2_bits) self.checkRectangle(sa3, scale_factor, lon, lat, precision, e_dim, n_dim, orientation_deg) self.assertEqual(sa1_bits, sa2_bits)
def testTextOnly(self): msg = [ '!AIVDM,2,1,0,A,85M:Ih1KmPA`tBAs85`01cON31N;U`P00000H;Gl1gfp52tjFq20H3r9P000,0*64', '!AIVDM,2,2,0,A,00000000bPbJT1Q9hd680000,0*03' ] sub_area_msg = msg[1].split(',')[5][-16:] sa1_bits = binary.ais6tobitvec(sub_area_msg) sa1 = AreaNoticeText(bits=sa1_bits) text = 'TEST LINE 1' self.checkText(sa1, text) sa2 = AreaNoticeText(text) self.checkText(sa2, text) sa2_bits = sa2.get_bits() self.assertEqual(sa1_bits, sa2_bits)
def testPolylineOnly(self): msg = [ '!AIVDM,2,1,0,A,85M:Ih1KmPA`tBAs85`01cON31N;U`P00000H;Gl1gfp52tjFq20H3r9P000,0*64', '!AIVDM,2,2,0,A,00000000bPbJT1Q9hd680000,0*03'] body = ''.join([sentence.split(',')[5] for sentence in msg]) sub_area_msg = body[-32:-16] self.assertEqual(16, len(sub_area_msg)) sa1_bits = binary.ais6tobitvec(sub_area_msg) sa1 = AreaNoticePoly(bits=sa1_bits) points1 = [(15.5, 550), (0., 0.), (0., 0.), (0., 0.)] scale_factor = 1 # Not what is in the example spreadsheet. self.checkPoly( sa1, SHAPES['POLYLINE'], scale_factor, None, None, points=points1) sa2 = AreaNoticePoly(SHAPES['POLYLINE'], points1, scale_factor) self.checkPoly( sa1, SHAPES['POLYLINE'], scale_factor, None, None, points=points1) sa2_bits = sa2.get_bits() self.assertEqual(sa1_bits, sa2_bits)
def testEncodeCircleMatchingUSCG(self): """Make sure we can recreate the bits in the USCG circle test.""" msg = '!AIVDM,1,1,0,A,85M:Ih1KmPAU6jAs85`03cJm;1NHQhPFP000,0*19' # grab just the sub area portion circle_msg = msg.split(',')[5][-16:] c1_bits = binary.ais6tobitvec(circle_msg) c1 = AreaNoticeCircle(bits=c1_bits) lon = -71.935 lat = 41.236666667 scale_factor = 10 precision = 4 radius = 1800 self.checkCircle(c1, scale_factor, lon, lat, precision, radius) # Now we build the same, must force the scale factor to match USCG c2 = AreaNoticeCircle(c1.lon, c1.lat, c1.radius, c1.precision, scale_factor) self.checkCircle(c2, scale_factor, lon, lat, precision, radius) c2_bits = c2.get_bits() c3 = AreaNoticeCircle(bits=c2_bits) self.checkCircle(c3, 10, lon, lat, precision, radius)
def testAis6ToBitvec(self): self.assertEqual(str(binary.ais6tobitvec('6')), '000110') self.assertEqual(str(binary.ais6tobitvec('6b')), '000110101010') self.assertEqual(str(binary.ais6tobitvec('6bF:R')), '000110101010010110001010100010')