a2bardeals Posted March 9, 2007 Share Posted March 9, 2007 i am posting a geocoding script that i found online that gives me parse errors like crazy. I need this to work. I can't figure out the problem. The first error i get is: Parse error: parse error in /Library/WebServer/Documents/bar/ver2/geocode/geo.php on line 3 I am also using PHP 4.1.2 if that makes a difference. When I fix the obvious one which i belive is the address input value: Address: <input type="text" size="40" name="address" value="<?=$_REQUEST[" />"> to Address: <input type=text" size="40" name="address" value="<? $_REQUEST["address] ?>"> I get a parse error on line 10 Here it is: <? define("DEBUG", false); // ===== Database parameters $db["user"] = "username"; $db["pass"] = "password"; $db["host"] = "localhost"; $db["database"] = "dbname"; ?> <h2>Geocode</h2> <form name="mainform" action="geocode.php" method="get"> Address: <input type="text" size="40" name="address" value="<?=$_REQUEST[" />"> <input type="submit" name="geo" value="Geocode" /> </form> <hr /> <? if ( array_key_exists("geo", $_REQUEST) ) { showresults(); } ?><?php// ==================================================================== // ==================================================================== PHP Functions // ==================================================================== // ==================================================================== show results // function showresults() { $address = $_REQUEST["address"]; // === Parse the address into it's various parts. $paddr = parse_address($address); // === Query the database for matching streets. $rsary = find_address($paddr); if ( !$rsary || count($rsary)> 1 ) { echo "No records found or more than one street segment matched. Be more specific. "; return; } // === Geocode the address. $latlon = geocode_address($rsary[0], $paddr); // === Display the lat/lon and a google maps link echo $latlon["lat"] . ", " . $latlon["lon"]; echo " <a href="http://blog.tooleshed.com/%5C%22http://maps.google.com/maps?f=q&hl=en&q=%22">Google Map</a>"; } // ==================================================================== geocode // function geocode_address($data, $addr) { $house_number = $addr["number"]; $from_number = $data["from_addr"]; $to_number = $data["to_addr"]; // === Convert the linedata string into an array of lat/lon pairs $chain = parse_linedata($data["linedata"]); // === Find the proportion between our house number and the fr/to numbers of the street segement $prop = ($house_number - $from_number) / ($to_number - $from_number); debug("house: $house_number fr: $from_number to: $to_number prop: $prop"); debug($chain); if ( count($chain) <2 ) { die("Error, linedata field bad: " . $data["linedata"] . " "); } if ( count($chain) == 2 ) { // === Using linear interpolation, we can calculate the lat/lon of our house on the street segment $house = lerp($chain[0], $chain[1], $prop); } else { // === The chain has more than two points, so a more complex calculation is required. $house = calc_position($chain, $prop); } return $house; } // ==================================================================== calc_position // function calc_position($chain, $prop) { $total_dist = 0; // First calculate the distance between each set of points // and the total distance of our entire street segment for ($i=0; $i $dist = calc_dist($chain[$i], $chain[$i+1]); $p2p_dist[$i] = $dist; $total_dist += $dist; debug("Distance from Point $i to " . ($i+1) . " = $dist ($total_dist)"); } // Now that we have the total distance we can figure out where // on the segment our address will be using the proportion. $house_dist = $total_dist * $prop; // Next we need to determine between which two set of points // our house_dist lies. $i=0; $part_dist = 0; while ($part_dist <$house_dist) { $part_dist += $p2p_dist[$i++]; } $i--; // Now we need to find the proportion at the partial distance level $part_from = $part_dist - $p2p_dist[$i]; $part_prop = ($house_dist - $part_from) / ($part_dist - $part_from); debug("i: $i house_dist: $house_dist part_dist: $part_dist, part_from: $part_from, part_prop: $part_prop"); // And with that we can now do the interpolation betwen the points at // that sub-part of the street segment. $house = lerp($chain[$i], $chain[$i+1], $part_prop); debug($house); return $house; } // ==================================================================== calc_dist // Calculates the distance between two lat/lon points // See: http://www.meridianworlddata.com/Distance-Calculation.asp function calc_dist($fr, $to) { $lat1 = deg2rad($fr["lat"]); $lon1 = deg2rad($fr["lon"]); $lat2 = deg2rad($to["lat"]); $lon2 = deg2rad($to["lon"]); $d = 3963 * acos( sin($lat1)*sin($lat2) + cos($lat1)*cos($lat2)*cos($lon2 - $lon1) ); return $d; } // ==================================================================== lerp // Performs linear interpolation on the lat and lon function lerp($fr, $to, $prop) { $frlat = $fr["lat"]; $frlon = $fr["lon"]; $tolat = $to["lat"]; $tolon = $to["lon"]; $point["lat"] = $frlat + ($prop * ($tolat - $frlat)); $point["lon"] = $frlon + ($prop * ($tolon - $frlon)); return $point; } // ==================================================================== parse_linedata // function parse_linedata($linedata) { // === Explode the linedata string of lat/lon's into an array: /* Example returned array: Array ( [0] => Array ( [lon] => -122.628906 [lat] => 45.53354 ) [1] => Array ( [lon] => -122.627906 [lat] => 45.53354 ) ) */ foreach ( explode(",", $linedata) as $latlon) { list($lon, $lat) = explode(" ", $latlon); $ll[] = array("lon" => ($lon/1000000), "lat" => ($lat/1000000)); } return $ll; } // ==================================================================== find_address // Build a query to find the street in the database // function find_address($addr) { global $db; require_once("adodb/adodb.inc.php"); $number = $addr["number"]; $dsn = "mysql://" . $db["user"] . ":" . $db["pass"] . "@" . $db["host"] . "/" . $db["database"]; $dbConn = ADONewConnection($dsn); $dbConn->debug = DEBUG; if (!$dbConn) { echo("Connection failed"); exit; } $q = " select cc_id, linedata, fedirp, fename, fetype, fedirs, if(fraddl % 2 = $number % 2, fraddl, fraddr) as from_addr, if(fraddl % 2 = $number % 2, toaddl, toaddr) as to_addr from completechain "; $q .= "where fename = " . $dbConn->qstr($addr["name"]) . " "; // === Build the Where clause $wh = ""; if ( array_key_exists("prefix", $addr) ) { $wh .= "and fedirp = " . $dbConn->qstr($addr["prefix"]) . " "; } if ( array_key_exists("type", $addr) ) { $wh .= "and fetype = " . $dbConn->qstr($addr["type"]) . " "; } if ( array_key_exists("suffix", $addr) ) { $wh .= "and fedirs = " . $dbConn->qstr($addr["suffix"]) . " "; } $wh .= "and ( (fraddr <= $number and toaddr>= $number) OR (fraddl <= $number and toaddl>= $number) )"; // === Add the where to the query $q .= $wh; debug($q); $rs = $dbConn->GetAll($q); $dbConn->Close(); return $rs; } // ==================================================================== parse_address // function parse_address($address="") { $dir=array( "N"=>"N","S"=>"S","E"=>"E","W"=>"W","NW"=>"NW","SW"=>"SW","NE"=>"NE","SE"=>"SE", "North"=>"N","South"=>"S","East"=>"E","West"=>"W","Northwest"=>"NW", "Southwest"=>"SW","Northeast"=>"NE","Southeast"=>"SE" ); $type=array( "ave"=>"Ave","blvd"=>"Blvd","st"=>"St","wy"=>"Wy","cir"=>"Cir","dr"=>"Dr", "ln"=>"Ln","Pl"=>"Pl","Rd"=>"Rd","Bvd"=>"Blvd","Avenue"=>"Ave","Boulevard"=>"Blvd", "Street"=>"St","Way"=>"Wy","Circle"=>"Cir","Drive"=>"Dr","Lane"=>"Ln","Place"=>"Pl", "Road"=>"Rd" ); $apts = "Apt|Apartment|Suite|Ste|Unit|Bldg|Building|Room|Rm|#"; $out["address_type"] = "Presumed Standard"; $address=trim($address); $out["raw_address"] = $address; $original = $address; //remove any unit or apt # from the end //a number alone at the end is not enough, we need at least # or one of the descriptors in () if( preg_match('/(\s+(' . $apts . ')\s*)+#?[-a-z0-9]+$/i', $address, $matches)){ $out["raw_unit"] = $matches[0]; $out["unit"] = preg_replace('/(\s+(' . $apts . ')\s*)+#?/i','',$matches[0]); //break raw unit down $address = substr($address, 0, strlen($address)-strlen($matches[0])); } //parse suffix direction (SW) $dirs = implode("|", array_keys($dir)); if(preg_match('/\s+(' . $dirs . ')$/i', $address, $matches)){ $out["raw_suffix"] = trim($matches[0]); $out["suffix"] = $dir[$out["raw_suffix"]]; $address=substr($address, 0, strlen($address)-strlen($matches[0])); } //remove type of street $types = implode("|", array_keys($type)); if(preg_match('/\s+(' . $types . ')$/i', $address, $matches)){ $out["raw_type"] = trim($matches[0]); strlen($out["raw_type"])> 3 || strtolower($out["raw_type"]) == 'way' || strtolower($out["raw_type"]) == 'bvd' ? $typeDefinite = false : $typeDefinite = true; $out[type] = $type[strtolower($out["raw_type"])]; $address = substr($address, 0, strlen($address)-strlen($matches[0])); } //remove number and fraction if(preg_match('/^[0-9]+(\s+[0-9]+\/[0-9]+)*/', $address, $matches)){ $address = substr($address, strlen($matches[0]), strlen($address)-strlen($matches[0])); if(preg_match('/\s+[0-9]+\/[0-9]+$/',$matches[0],$mmatch)){ $out["fraction"] = $mmatch[0]; $matches[0] = substr($matches[0], 0, strlen($matches[0])-strlen($mmatch[0])); } $out[number] = trim($matches[0]); $numberFormat = 'standard'; } else { $numberFormat = 'irregular'; //account for possible P.O. Boxes and Rural Routes if(preg_match('/^(POB\s+|P\s*O\s*Box|Post Office Box|Postal Box|Box|Boite Postal)\s*[0-9a-z]+(-[0-9a-z]+)*/i', $address, $matches)) { $out["raw_po_box"] = $matches[0]; preg_match('/[0-9a-z]+(-[0-9a-z]+)*$/i', $matches[0], $mmatch); $out["po_box"] = strtoupper($mmatch[0]); $out["address_type"] = "Post Office Box"; } if(preg_match('/(Rrte|RR|Rural Route|Rt|Rte|Route)\s+[0-9]+\s+(Box|Bx)\s+[0-9]+/i', $address, $matches)){ $out["raw_route"] = $matches[0]; $matches = explode('b',strtolower($matches[0])); $out["route_number"] = preg_replace('/[^0-9]+/', '', $matches[0]); $out["route_box_number"] = preg_replace('/[^0-9]+/', '', $matches[1]); $out["address_type"] = "Rural Route"; } //Account for HC nomenclature -- for drawmack if(preg_match('/(HC|Highway County|Hwy Cty|Hwy County)\s+[0-9]+\s+(Box|Bx)\s+[0-9]+/i',$address,$matches)){ $out["raw_hc"]=$matches[0]; $matches=explode('b', strtolower($matches[0])); $out["hc_number"] = preg_replace('/[^0-9]+/', '', $matches[0]); $out["hc_box_number"] = preg_replace('/[^0-9]+/', '',$matches[1]); $out["address_type"] = "Highway County Route"; } //Account for * | Star Route if(preg_match('/(\*\s+Rte|\*\s+Route|Star\s+Route|Star\s+Rte)\s+[0-9]+\s+(Box|Bx)\s+[0-9]+/i',$address,$matches)){ $out["raw_starrt"]=$matches[0]; $matches=explode('b',strtolower($matches[0])); $out["starrt_number"]=preg_replace('/[^0-9]+/','',$matches[0]); $out["starrt_box_number"]=preg_replace('/[^0-9]+/','',$matches[1]); $out["address_type"]="Star Route"; } /*** Note on the above 4 nodes: we don't check that an address only partially conforms, such as Rte 1 (no box number), and perhaps we should. Perhaps "Route 1" is even OK in some areas ***/ } //what remains is the prefix direction, and street, several analyses to make here /*** note that if there is still an address left over yet we pulled a PO Box above or a Rural Route, then either something is wrong or our code missed something, this should be flagged. ***/ $address = trim($address); if(preg_match('/^(' . $dirs . ')\s+/i', $address, $matches)){ $out["prefix"] = $dir[trim($matches[0])]; strlen($matches[0])> 2 ? $out["raw_prefix"] = $matches[0] : ''; $address = substr($address, strlen($matches[0]), strlen($address)-strlen($matches[0])); } //presume all else is the name $out["name"] = trim($address); //present the array visibly in a logical order -- not required for operation but nice $order=array( "type_definite", "address_type", "route_number", "route_box_number", "hc_number", "hc_box_number", "starrt_number", "starrt_box_number", "po_box", "number", "fraction", "prefix", "name", "type", "suffix", "unit", "raw_po_box", "raw_route", "raw_hc", "raw_starrt", "raw_prefix", "raw_suffix", "raw_type", "raw_unit", "raw_address" ); foreach($order as $v){ isset($out[$v]) ? $ret[$v] = $out[$v] : ''; } return $ret; } // =========================== Utility functions function debug($s) { if ( DEBUG ) { if ( is_array($s) || is_object($s) ) { view($s); } else { echo " $s "; } } } function view($obj) { echo " <pre>"; print_r($obj); echo "</pre> "; } ?> Link to comment https://forums.phpfreaks.com/topic/42006-find-the-parse-errors-2/ Share on other sites More sharing options...
per1os Posted March 9, 2007 Share Posted March 9, 2007 <input type="text" size="40" name="address" value="<? $_REQUEST["address"] ?>"> should be <input type="text" size="40" name="address" value="<?=$_REQUEST["address"]; ?>"> --FrosT Link to comment https://forums.phpfreaks.com/topic/42006-find-the-parse-errors-2/#findComment-203685 Share on other sites More sharing options...
a2bardeals Posted March 9, 2007 Author Share Posted March 9, 2007 still get a parse error further down on Line 10 Link to comment https://forums.phpfreaks.com/topic/42006-find-the-parse-errors-2/#findComment-203692 Share on other sites More sharing options...
per1os Posted March 9, 2007 Share Posted March 9, 2007 // === Display the lat/lon and a google maps link echo $latlon["lat"] . ", " . $latlon["lon"]; echo " <a href="http://blog.tooleshed.com/%5C%22http://maps.google.com/maps?f=q&hl=en&q=%22">Google Map</a>"; should be // === Display the lat/lon and a google maps link echo $latlon["lat"] . ", " . $latlon["lon"]; echo " <a href=\"http://blog.tooleshed.com/%5C%22http://maps.google.com/maps?f=q&hl=en&q=%22\">Google Map</a>"; Those double quotes need to be escaped. --FrosT Link to comment https://forums.phpfreaks.com/topic/42006-find-the-parse-errors-2/#findComment-203697 Share on other sites More sharing options...
a2bardeals Posted March 9, 2007 Author Share Posted March 9, 2007 still a parse error on 10 Link to comment https://forums.phpfreaks.com/topic/42006-find-the-parse-errors-2/#findComment-203700 Share on other sites More sharing options...
redarrow Posted March 9, 2007 Share Posted March 9, 2007 is this correct please function calc_position($chain, $prop) { $total_dist = 0; // First calculate the distance between each set of points // and the total distance of our entire street segment for ($i=0; $i $dist=calc_dist( $chain[$i] , $chain[$i+1] ){ $p2p_dist[$i] = $dist; $total_dist += $dist; debug("Distance from Point $i to " . ($i+1) . " = $dist ($total_dist)"); } line 43-82 function calc_position Link to comment https://forums.phpfreaks.com/topic/42006-find-the-parse-errors-2/#findComment-203701 Share on other sites More sharing options...
a2bardeals Posted March 9, 2007 Author Share Posted March 9, 2007 i don't know if any of this is correct its a script from a tutorial. I get crazy parse errors on all of it... Link to comment https://forums.phpfreaks.com/topic/42006-find-the-parse-errors-2/#findComment-203710 Share on other sites More sharing options...
redarrow Posted March 9, 2007 Share Posted March 9, 2007 i have been throw the whole code with zend and the above function is wrong please post tutoral cheers. Link to comment https://forums.phpfreaks.com/topic/42006-find-the-parse-errors-2/#findComment-203713 Share on other sites More sharing options...
a2bardeals Posted March 9, 2007 Author Share Posted March 9, 2007 the tutorial where i am getting this from is: http://blog.tooleshed.com/?page_id=18 **it's page 2 of the proccess Link to comment https://forums.phpfreaks.com/topic/42006-find-the-parse-errors-2/#findComment-203717 Share on other sites More sharing options...
redarrow Posted March 9, 2007 Share Posted March 9, 2007 http://blog.tooleshed.com/?p=16 read this ? have u? Link to comment https://forums.phpfreaks.com/topic/42006-find-the-parse-errors-2/#findComment-203726 Share on other sites More sharing options...
a2bardeals Posted March 9, 2007 Author Share Posted March 9, 2007 i have read the article yes. that is where i got the code from and how i got to step 2. the first file they give you had tons of errors but i hacked it a bit until i loaded the data in. the second script i cannot get to work which is the reason for my post in the first place Link to comment https://forums.phpfreaks.com/topic/42006-find-the-parse-errors-2/#findComment-203734 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.