001 package ps6.tigerdb; 002 003 import ps2.GeoPoint; 004 005 /** 006 * TigerRT1 represents a Complete-Chain Basic Data Record. 007 * 008 * @author Felix S. Klock II 009 */ 010 public class TigerRT1 extends TigerRwTLID { 011 012 013 public static final long serialVersionUID = 4534; 014 private GeoPoint from, to; 015 private Feature feature; 016 017 private DirectedStreetNumberRange lftRange; 018 private DirectedStreetNumberRange rgtRange; 019 020 private String cfc; 021 022 private String lftZip; 023 private String rgtZip; 024 025 public String toString() { 026 return "TigerRT1< "+from+", "+to+ 027 ", "+feature+ 028 ", "+lftRange+", "+rgtRange+ 029 ", "+lftZip+", "+rgtZip+ 030 " >"; 031 } 032 033 /** Constructs a TigerRT1 from a line of Record Type 1 as specified 034 * in the Data Dictionary for the Tiger/Line files. 035 */ 036 public TigerRT1(String s) throws BadRecordException { 037 super(s, 228); 038 if (s.charAt(0) != '1') 039 die("RT1 record type must be 1, not "+s.charAt(0)); 040 041 int lat1, lng1, lat2, lng2; 042 lat1 = lng1 = lat2 = lng2 = 0; 043 try { 044 lat1 = toInt(s.substring(190,200)); 045 lng1 = toInt(s.substring(200,209)); 046 lat2 = toInt(s.substring(209,219)); 047 lng2 = toInt(s.substring(219,228)); 048 // from = new GeoPoint(div1M(toInt(s.substring(190,200))), 049 // div1M(toInt(s.substring(200,209)))).intern(); 050 // to = new GeoPoint(div1M(toInt(s.substring(209,219))), 051 // div1M(toInt(s.substring(219,228)))).intern(); 052 if (lat1 == lat2 && lng1 == lng2) { 053 // System.out.println("XXX "+s + "\nXXX is zero length"); 054 throw new BadRecordException(s, "zero length geosegment!"); 055 } 056 } catch (NoInt e) { 057 throw new RuntimeException 058 (s.substring(190,228)+ " should contain two Points"); 059 } 060 from = makeGP(lat1, lng1); 061 to = makeGP(lat2, lng2); 062 063 // Do not call Feature.intern(), since Feature is short-lived, 064 // and doesn't intern well 065 feature = new Feature(s.substring(17, 55)); 066 067 cfc = s.substring(55,58); 068 069 lftRange = parseAddrRange(s.substring(58, 69), s.substring(69, 80)); 070 rgtRange = parseAddrRange(s.substring(80, 91), s.substring(91, 102)); 071 072 lftZip = s.substring(106, 111).intern(); 073 rgtZip = s.substring(111, 116).intern(); 074 } 075 076 077 078 /** Returns the primary name of this, or "" if this does not have 079 * a primary name. Right now the name contains the Primary 080 * Feature PrefixDirection, Name, Type, and SuffixDirection. 081 */ 082 public String primaryName() { return feature.fullName(); } 083 084 public boolean hasAddress(int a) { 085 if (lftRange != null && lftRange.contains(a)) 086 return true; 087 if (rgtRange != null && rgtRange.contains(a)) 088 return true; 089 return false; 090 } 091 092 /** 093 * @return the CFC of this, whatever that is. 094 */ 095 public String getCfc() { 096 return cfc; 097 } 098 099 /** 100 * @return the start of this RT1 101 */ 102 public GeoPoint getStart() { 103 return from; 104 } 105 106 /** 107 * @return the end of this RT1 108 */ 109 public GeoPoint getEnd() { 110 return to; 111 } 112 113 /** 114 * @return the feature assocated with this RT1 115 */ 116 public Feature getFeature() { 117 return feature; 118 } 119 120 /** 121 * @return the left zipcode associated with this RT1 122 */ 123 124 public String getLeftZip() { 125 return lftZip; 126 } 127 128 129 /** 130 * @return the right zipcode associated with this RT1 131 */ 132 133 public String getRightZip() { 134 return rgtZip; 135 } 136 137 /** 138 * @return the left street number range associated with this RT1 139 */ 140 public DirectedStreetNumberRange getLeftRange() { 141 return lftRange; 142 } 143 144 145 /** 146 * @return the right street number range associated with this RT1 147 */ 148 public DirectedStreetNumberRange getRightRange() { 149 return rgtRange; 150 } 151 152 153 } // TigerRT1