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 } 076 077 078 079 /** Returns the primary name of this, or "" if this does not have 080 * a primary name. Right now the name contains the Primary 081 * Feature PrefixDirection, Name, Type, and SuffixDirection. 082 */ 083 public String primaryName() { return feature.fullName(); } 084 085 public boolean hasAddress(int a) { 086 if (lftRange != null && lftRange.contains(a)) 087 return true; 088 if (rgtRange != null && rgtRange.contains(a)) 089 return true; 090 return false; 091 } 092 093 /** 094 * @return the CFC of this, whatever that is. 095 */ 096 public String getCfc() { 097 return cfc; 098 } 099 100 /** 101 * @return the start of this RT1 102 */ 103 public GeoPoint getStart() { 104 return from; 105 } 106 107 /** 108 * @return the end of this RT1 109 */ 110 public GeoPoint getEnd() { 111 return to; 112 } 113 114 /** 115 * @return the feature assocated with this RT1 116 */ 117 public Feature getFeature() { 118 return feature; 119 } 120 121 /** 122 * @return the left zipcode associated with this RT1 123 */ 124 125 public String getLeftZip() { 126 return lftZip; 127 } 128 129 130 /** 131 * @return the right zipcode associated with this RT1 132 */ 133 134 public String getRightZip() { 135 return rgtZip; 136 } 137 138 /** 139 * @return the left street number range associated with this RT1 140 */ 141 public DirectedStreetNumberRange getLeftRange() { 142 return lftRange; 143 } 144 145 146 /** 147 * @return the right street number range associated with this RT1 148 */ 149 public DirectedStreetNumberRange getRightRange() { 150 return rgtRange; 151 } 152 153 154 } // TigerRT1