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