当前位置: 首页 > 面试题库 >

mySQL在y范围内的x公里/英里内选择邮政编码

华章横
2023-03-14
问题内容

注意:尽管我将邮政编码数据库与荷兰邮政编码一起使用,但是此问题与国家/地区无关。

我有一个数据库,其中包含荷兰的每个邮政编码及其x和y坐标(纬度/经度)。

例如,我的邮政编码:$baseZipCode = 1044;具有以下坐标:

x coordinate = 4,808855
y coordinate = 52,406332

现在,我想使用$rangefrom查找其他所有邮政编码$baseZipCode

例如:

SELECT
  zipcode
FROM
  zipcodes
WHERE
  ????? // Need help here

问题在于地球并不完全是圆形的。我发现很多关于from a to b计算的教程,但这不是我所需要的。

有人有什么主意吗?

更新 感谢Captaintokyo,我发现了这一点:

是否要查找所有邮政编码和距另一个邮政编码或点的一定英里/公里半径内的对应距离?这个问题需要经纬度坐标来解决。对地址进行地理编码可为您提供地址的纬度/经度坐标。

首先,您将需要一个包含所有邮政编码及其对应的纬度和经度坐标的数据库:

CREATE TABLE `zipcodes` (
  `zipcode` varchar(5) NOT NULL DEFAULT '',
  `city` varchar(100) NOT NULL DEFAULT '',
  `state` char(2) NOT NULL DEFAULT '',
  `latitude` varchar(20) NOT NULL DEFAULT '',
  `longitude` varchar(20) NOT NULL DEFAULT '',
  KEY `zipcode` (`zipcode`),
  KEY `state` (`state`)
)

因此,一旦有了数据库,您便要查找中心点一定英里半径内的所有邮政编码。如果中心点是另一个邮政编码,只需在数据库中查询该邮政编码的纬度和经度坐标即可。然后代码如下:

// ITITIAL POINT

$coords = array('latitude' => "32.8", 'longitude' => "-117.17");

//RADIUS

$radius = 30;

// SQL FOR KILOMETERS

$sql = "SELECT zipcode, ( 6371 * acos( cos( radians( {$coords['latitude']} ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians( {$coords['longitude']} ) ) + sin( radians( {$coords['latitude']} ) ) * sin( radians( latitude ) ) ) ) AS distance FROM zipcodes HAVING distance <= {$radius} ORDER BY distance";

// SQL FOR MILES

$sql = "SELECT zipcode, ( 3959 * acos( cos( radians( {$coords['latitude']} ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians( {$coords['longitude']} ) ) + sin( radians( {$coords['latitude']} ) ) * sin( radians( latitude ) ) ) ) AS distance FROM zipcodes HAVING distance <= {$radius} ORDER BY distance";

// OUTPUT THE ZIPCODES AND DISTANCES

$query = mysql_query($sql);

while($row = mysql_fetch_assoc($query)){

    echo "{$row['zipcode']} ({$row['distance']})<br>\n";

}

(Yahoo和Google均提供免费的地理编码服务。)


问题答案:

您想做这样的事情:

SELECT zipcode FROM zipcodes WHERE DistanceFormula(lat, long, 4.808855,52.406332) < $range

如果您的邮政编码表很大,可能会很慢。您可能还想查看MySQL的地理空间扩展。



 类似资料:
  • 问题内容: 这可能不清楚,也可能不清楚,如果我不在基地或您需要更多信息,请给我评论。也许对于我想要的PHP已经有了解决方案。 我正在寻找一个函数,该函数将从经度或纬度值中增加或减去一个距离。 原因:我有一个包含所有纬度和经度的数据库,并且想要形成一个查询以提取X公里(或英里)内的所有城市。我的查询看起来像这样… 我正在使用MySql数据库使用PHP。 也欢迎任何建议!:) 问题答案: 这是一个My

  • 我的数据库中有100000个地址(即记录)。 它们中的每一个都有自己的坐标(纬度和经度)。 现在,考虑到用户的地理位置(纬度和经度),我只想在地图上显示5英里范围内的地址(使用Google maps v3 API)。 这意味着通常在100000个地址中只需显示5或6个地址。 一种解决方案可能是检索所有记录,并在Java中应用一个公式来计算每个地址的距离,并且仅当它在范围内时才显示它。 这将浪费处理

  • 问题内容: 我有一个按照以下示例结构的mysql表: 现在我想做的是创建一个查询,该查询将在搜索位置的选定公里内选择结果 因此,假设他们搜索“灰色河流”,然后选择“在20公里以内找到所有结果” 它显然应该选择“灰河”,但也应根据经度和纬度选择灰河20公里以内的所有位置。 我真的不知道该怎么做。我已经读过haversine公式,但不知道如何将其应用于mysql SELECT。 任何帮助将非常感激。

  • 我还在学习postgis,需要一些帮助。我有2张桌子,城市和景点。我想返回给定城市X英里内的所有景点。这些是我自己的桌子,所以我可以用任何最适合的方式设置它们。现在,我的景点有一个geom POINT列,srid 4326是lat/lng。我的城市表有一个geom BOUNING BOX(POLYGON)列,它包围了城市边界。我用ST_MakeEnvelope来填写该列,也是4326。 我看过ST

  • 问题内容: 是否可以为查询的IN部分定义一个范围,像这样 代替 问题答案: 您不能,但可以使用 请注意,这是包含性内容,并且将包含ID为10和15的项。 如果不想包含,则必须退回到使用and 运算符。

  • 问题内容: 我是Hibernate Spatial的新手,正在尝试对给定半径内的对象执行简单查询。我已经使用来自Google Maps和其他来源的数据在数据库中创建了许多条目,这些条目的属性分别对应于经度和纬度。此属性在我的Entity类中定义如下: 我现在正在尝试找出如何搜索所有坐标位于距给定点 x 公里半径内的实体对象的方法。例如,我想找到落在该点半径50公里以内的对象(12.34567,-7