Merge pull request #1670 from lonvia/permalinks-for-tiger-and-interpolation

Enable Permalinks to dtails for tiger and interpolation
This commit is contained in:
Sarah Hoffmann
2020-02-09 21:07:19 +01:00
committed by GitHub
5 changed files with 110 additions and 8 deletions

View File

@@ -12,6 +12,8 @@ function formatOSMType($sType, $bIncludeExternal = true)
if ($sType == 'T') return 'way';
if ($sType == 'I') return 'way';
// not handled: P, L
return '';
}
@@ -33,20 +35,39 @@ function wikipediaLink($aFeature)
return '';
}
function detailsLink($aFeature, $sTitle = false)
function detailsLink($aFeature, $sTitle = false, $sExtraProperties = false)
{
if (!$aFeature['place_id']) return '';
return '<a href="details.php?place_id='.$aFeature['place_id'].'">'.($sTitle?$sTitle:$aFeature['place_id']).'</a>';
$sHtml = '<a ';
if ($sExtraProperties) {
$sHtml .= $sExtraProperties.' ';
}
$sHtml .= 'href="details.php?place_id='.$aFeature['place_id'].'">'.($sTitle?$sTitle:$aFeature['place_id']).'</a>';
return $sHtml;
}
function detailsPermaLink($aFeature, $sRefText = false)
function detailsPermaLink($aFeature, $sRefText = false, $sExtraProperties = false)
{
$sOSMType = formatOSMType($aFeature['osm_type'], false);
if ($sOSMType) {
$sLabel = $sRefText ? $sRefText : $sOSMType.' '.$aFeature['osm_id'];
return '<a href="details.php?osmtype='.$aFeature['osm_type'].'&osmid='.$aFeature['osm_id'].'&class='.$aFeature['class'].'">'.$sLabel.'</a>';
$sHtml = '<a ';
if ($sExtraProperties) {
$sHtml .= $sExtraProperties.' ';
}
$sHtml .= 'href="details.php?osmtype='.$aFeature['osm_type']
.'&osmid='.$aFeature['osm_id'].'&class='.$aFeature['class'].'">';
if ($sRefText) {
$sHtml .= $sRefText.'</a>';
} else {
$sHtml .= $sOSMType.' '.$aFeature['osm_id'].'</a>';
}
return $sHtml;
}
return '';
return detailsLink($aFeature, $sRefText, $sExtraProperties);
}

View File

@@ -85,7 +85,7 @@
else
echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['type'])).')</span>';
echo '<p>'.$aResult['lat'].','.$aResult['lon'].'</p>';
echo ' <a class="btn btn-default btn-xs details" href="details.php?osmtype='.$aResult['osm_type'].'&osmid='.$aResult['osm_id'].'&class='.$aResult['class'].'">details</a>';
echo detailsPermaLink($aResult, 'details', 'class="btn btn-default btn-xs details"');
echo '</div>';
?>
</div>

View File

@@ -53,7 +53,7 @@
echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['class'])).')</span>';
else
echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['type'])).')</span>';
echo ' <a class="btn btn-default btn-xs details" href="details.php?osmtype='.$aResult['osm_type'].'&osmid='.$aResult['osm_id'].'&class='.$aResult['class'].'">details</a>';
echo detailsPermaLink($aResult, 'details', 'class="btn btn-default btn-xs details"');
echo '</div>';
$i = $i+1;
}

View File

@@ -0,0 +1,71 @@
<?php
namespace Nominatim;
require_once(CONST_BasePath.'/lib/output.php');
class OutputTest extends \PHPUnit\Framework\TestCase
{
public function testDetailsPermaLinkNode()
{
$aFeature = array('osm_type' => 'N', 'osm_id'=> 38274, 'class' => 'place');
$this->assertSame(
detailsPermaLink($aFeature),
'<a href="details.php?osmtype=N&osmid=38274&class=place">node 38274</a>'
);
}
public function testDetailsPermaLinkWay()
{
$aFeature = array('osm_type' => 'W', 'osm_id'=> 65, 'class' => 'highway');
$this->assertSame(
detailsPermaLink($aFeature),
'<a href="details.php?osmtype=W&osmid=65&class=highway">way 65</a>'
);
}
public function testDetailsPermaLinkRelation()
{
$aFeature = array('osm_type' => 'R', 'osm_id'=> 9908, 'class' => 'waterway');
$this->assertSame(
detailsPermaLink($aFeature),
'<a href="details.php?osmtype=R&osmid=9908&class=waterway">relation 9908</a>'
);
}
public function testDetailsPermaLinkTiger()
{
$aFeature = array('osm_type' => 'T', 'osm_id'=> 2, 'place_id' => 334);
$this->assertSame(
detailsPermaLink($aFeature, 'foo'),
'<a href="details.php?place_id=334">foo</a>'
);
}
public function testDetailsPermaLinkInterpolation()
{
$aFeature = array('osm_type' => 'I', 'osm_id'=> 400, 'place_id' => 3);
$this->assertSame(
detailsPermaLink($aFeature, 'foo'),
'<a href="details.php?place_id=3">foo</a>'
);
}
public function testDetailsPermaLinkWithExtraPropertiesNode()
{
$aFeature = array('osm_type' => 'N', 'osm_id'=> 2, 'class' => 'amenity');
$this->assertSame(
detailsPermaLink($aFeature, 'something', 'class="xtype"'),
'<a class="xtype" href="details.php?osmtype=N&osmid=2&class=amenity">something</a>'
);
}
public function testDetailsPermaLinkWithExtraPropertiesTiger()
{
$aFeature = array('osm_type' => 'T', 'osm_id'=> 5, 'place_id' => 46);
$this->assertSame(
detailsPermaLink($aFeature, 'something', 'class="xtype"'),
'<a class="xtype" href="details.php?place_id=46">something</a>'
);
}
}

View File

@@ -44,6 +44,16 @@ if ($sOsmType && $iOsmId > 0) {
$sSQL .= ' ORDER BY class ASC';
$sPlaceId = $oDB->getOne($sSQL, array(':type' => $sOsmType, ':id' => $iOsmId));
// Nothing? Maybe it's an interpolation.
// XXX Simply returns the first parent street it finds. It should
// get a house number and get the right interpolation.
if (!$sPlaceId && $sOsmType == 'W' && (!$sClass || $sClass == 'place')) {
$sSQL = 'SELECT place_id FROM location_property_osmline'
.' WHERE osm_id = :id LIMIT 1';
$sPlaceId = $oDB->getOne($sSQL, array(':id' => $iOsmId));
}
// Be nice about our error messages for broken geometry
if (!$sPlaceId) {