Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何确定每个州的中心邮政编码?_Php_Mysql - Fatal编程技术网

Php 如何确定每个州的中心邮政编码?

Php 如何确定每个州的中心邮政编码?,php,mysql,Php,Mysql,我有一个邮政编码MySQL数据库,其中包含每个邮政编码的lat/lng。如何查找每个州的中心邮政编码?我会用PHP来做这件事。Kludge it。将所有状态都做成矩形 SELECT state, (MAX(lat)-MIN(lat))/2 + MIN(lat) 'center_lat', (MAX(lng)-MIN(lng))/2 + MIN(lng) 'center_lng' FROM table GROUP BY state 这并不完美,但除非你喜欢复杂的数学,否则这是最糟糕的

我有一个邮政编码MySQL数据库,其中包含每个邮政编码的lat/lng。如何查找每个州的中心邮政编码?我会用PHP来做这件事。

Kludge it。将所有状态都做成矩形

SELECT
  state,
  (MAX(lat)-MIN(lat))/2 + MIN(lat) 'center_lat',
  (MAX(lng)-MIN(lng))/2 + MIN(lng) 'center_lng'
FROM table
GROUP BY state
这并不完美,但除非你喜欢复杂的数学,否则这是最糟糕的情况

编辑:我刚刚重读了这个问题,意识到它不是要中间的lat/lng,而是要中间的zip。检索到每个州的近似中心lat/lng列表后,您可以循环查找每个州最近的ZIP

SELECT
  zip,
  ABS(lat-$center_lat) + ABS(lng-$center_lng) 'diff'
FROM table
WHERE state = $state
ORDER BY diff ASC
LIMIT 1

假设您希望将每个邮政编码的坐标视为每个州内相等的加权点,并找到最接近有效重心的邮政编码,您可以在MySQL中通过以下组合直接执行此操作:

)

谷歌文章中关于使用PHP、MySQL和谷歌地图创建商店定位器的部分;及

获取数据的一般技术

完整的查询是:

-最近的邮政编码 选择州,z.zip_代码 从邮政编码z连接 -重心与最近邮政编码之间的距离 选择状态,c.lat,c.lon 米纳科斯 COSc.lat*COSRADIANSz.lat*COSRADIANSz.lon-c.lon +SINc.lat*sinradiasz.lat 闵 从邮政编码z连接 -每个状态的重心 选择状态, ATAN2 Sumsin板条/计数*, SQRT 功率辐射板*SINRADIANSlon/计数*,2 +功率cosradianslat*COSRADIANSlon/计数*,2 作为lat, ATAN2 SUMCOSRADIANSlat*SINRADIANSlon/计数*, SUMCOSRADIANSlat*COSRADIANSlon/计数* 阿伦 来自邮政编码 按州分组 c使用状态 按州分组 d使用状态 ACOS在哪里 COSd.lat*COSRADIANSz.lat*COSRADIANSz.lon-d.lon +SINd.lat*sinradiasz.lat =d.min 笔记 这可能会非常慢,因为除了在state列上建立索引之外,其他索引将没有多大用处,但这也是一个一次性操作,因此缓存结果应该不会有太多问题

在人口稠密的地区有许多邮政编码,而在人口稀少的地区则很少。因此,确定的重心可能离地理中心有一定距离,但如果需要的话,它可能是人口中心的合理代表

为每个邮政编码添加适当的权重将产生合理的近似值:例如,根据每个邮政编码覆盖的总土地面积确定地理中心的权重;或按每个邮政编码内的居民人口查找实际人口中心

拥有一个真正的地理中心的唯一方法是从每个国家的边界导出质心。可以从站点下载合适边界多边形的坐标


@布拉德:是一个定义明确的属性,即a在地球表面的径向投影;另请参见。@eggyal,它并不像您想象的那样定义明确。谁说他想要地理中心?这对于城市来说尤其成问题。中心的邮政编码是多少?一些邮政编码边界非常不规则。你只想知道中心点所在的邮政编码吗?如果该邮政编码有多个边界,并且只有一小部分位于该点,该怎么办?也许你想要一个中心点最接近州中心点的邮政编码?对于一个形状奇怪的州,你可以得到一个完全不同的州中心的坐标。例如,以爱达荷州为例:中心将非常北:由此产生的中心点可能在蒙大拿州;佛罗里达的中点几乎肯定位于大西洋;以这种方式定位最近的邮政编码忽略了这样一个事实,即当你接近两极时,经线会越来越近,而向赤道的距离会越来越远。我同意这是一种既便宜又简单的方法,但遗憾的是,我担心它可能太粗糙,没有任何实际用途。是的,“中心”可能在实际状态之外,但第二个声明仍然会在实际状态之内选择一个拉链。我说这是一个难题,但我不够聪明,不能像你所贴的那样想出一个解决方案p您编辑的最新SQL对两个州最有帮助,HI和AK!因为这两个州的lat/lng中心不是邮政编码的一部分,所以您的SQL能够找到最近的一个!在这两种情况下,他们都在20-30英里之外。我还在试着理解你是怎么做的。此外,“差异”代表什么?谢谢diff是一种简单的、缩短的方法,用于计算两点之间的距离,因为实际值并不重要。它应该是SQRTPOWABSlat-$center_lat,2+POWABSlng-$center_lng,2代表毕达哥拉斯的任何东西P