这是我第一次了解地理位置。请原谅我的长问题。我希望一切都清楚。
我有一个数据库保存经纬度的记录。我正在尝试编写一个 PHP 类,它定义了形成边界框的四个十进制坐标(然后检索框中的所有记录)。
我只需要知道哪些位置在用户位置的 n 公里范围内。我不需要从用户到位置的距离。
我正在构建这个 answer 的第一部分.
上述答案的核心是:
10 km in a straight line is:
on the latitude is equal to ~1'(minute) on the longitude is equal to ~6'(minutes)Using this as a basis, do some quick math and in your query add to the WHERE clause removing any locations that are outside the 'box' that is created by adding the buffer zone with the assumption of 1' lat & 6' long.
嗯,帕特里克说,“快速算一下”。几天后我没能正确地做数学题。
我的类(class)在那里坚持,似乎可以工作 10 公里。但是,我无法让它在任何其他距离下工作。
首先我移动到秒,所以 10km 是:
on the latitude is equal to 60 seconds
on the longitude is equal to 360 seconds
这很好用。
不过,我再试了5km是:
on the latitude is equal to 30 seconds
on the longitude is equal to 180 seconds
这没有用。
您能解释一下为什么这种方法不适用于 5 公里(以及我尝试过的其他距离)吗?
下面是我的类(class)代码。显然开关是垃圾。任何帮助表示赞赏。
class coords
{
/*
Calculate a bounding box from a decimal coordinate and distance.
The public vars are populated with minimum and maximum longitudes and latitudes which define the boundary.
*/
public $dec_lat_min;
public $dec_lat_max;
public $dec_lng_min;
public $dec_lng_max;
function init($dec_lat, $dec_lng, $dist)
{
// This switch is a terrible way to allow multiple distances.
// 10km = 1 min lat = 60 sec lat
// 10km = 6 min lng = 360 sec lng
// 5km = 30 sec lat
// 5km = 180 sec lng
// 1km = 6 sec lat
// 1km = 36 sec lat
// 500m = 3 sec lat
// 500m = 18 sec lat
switch($dist)
{
case 10: // 10km
$sec_diff_lat = 60;
$sec_diff_lng = 360;
break;
case 5: // 5km
$sec_diff_lat = 30;
$sec_diff_lng = 180;
break;
case 1: // 1km
$sec_diff_lat = 6;
$sec_diff_lng = 36;
break;
default: // 500m
$sec_diff_lat = 3;
$sec_diff_lng = 18;
break;
}
// Convert lat to DMS
$dms_lat = $this->dec2dms($dec_lat);
// Allow for western hemisphere (ie negative)
$dms_lat['hem'] == '-' ? $h = -1 : $h = 1;
// Populate min and max latitudes
$this->dec_lat_min = $this->dms2dec($dms_lat['deg'],$dms_lat['min'],$dms_lat['sec']+(-1 * $sec_diff_lat * $h),$dms_lat['hem']);
$this->dec_lat_max = $this->dms2dec($dms_lat['deg'],$dms_lat['min'],$dms_lat['sec']+($sec_diff_lat * $h),$dms_lat['hem']);
$dms_lng = $this->dec2dms($dec_lng);
$dms_lng['hem'] == '-' ? $h = -1 : $h = 1;
$this->dec_lng_min = $this->dms2dec($dms_lng['deg'],$dms_lng['min'],$dms_lng['sec']+(-1 * $sec_diff_lng * $h),$dms_lng['hem']);
$this->dec_lng_max = $this->dms2dec($dms_lng['deg'],$dms_lng['min'],$dms_lng['sec']+($sec_diff_lng * $h),$dms_lng['hem']);
}
function dec2dms($d)
{
$d = (string)$d;
// got dashes?
if ($d[0] == "-") {
$hem = '-';
$dVal = substr($d,1);
} else {
$hem = '';
$dVal = $d;
}
// degrees = degrees
$dVals = explode('.', $dVal);
$dmsDeg = $dVals[0];
// * 60 = mins
$dRemainder = ('0.'.$dVals[1]) * 60;
$dmsMinVals = explode('.', $dRemainder);
$dmsMin = $dmsMinVals[0];
// * 60 again = secs
$dMinRemainder = ('0.'.$dmsMinVals[1]) * 60;
$dmsSec = round($dMinRemainder);
return array("deg"=>$dmsDeg,"min"=>$dmsMin,"sec"=>$dmsSec, "hem"=>$hem);
}
function dms2dec($deg,$min,$sec,$hem)
{
// find decimal latitude
$d = $deg+((($min*60)+($sec))/3600);
$d = $hem.$d;
return $this->round100000($d);
}
function round100000($v)
{
return round($v * 100000) / 100000;
}
}
最佳答案
10 km in a straight line is: on the longitude is equal to ~6 minutes
距离与经度的比率不是一个常数 - 它取决于用户的纬度。您可以使用此函数来计算经度差:
function distanceToLng($distance,$latDeg) {
$latRad = $latDeg / 180 * M_PI;
$R = 6371;
return atan2(1*sin($distance/$R)*cos($latRad), cos($distance/$R) - sin($latRad)*sin($latRad)) * (180 / M_PI);
}
公式取自this问题。
您可以使用这样的方法计算给定距离的纬度差:
$lngDeg = $distanceInKm/6371 * 180 / M_PI
关于php - 没有距离的地理搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11564664/
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r
如何在Ruby中获取BasicObject实例的类名?例如,假设我有这个:classMyObjectSystem我怎样才能使这段代码成功?编辑:我发现Object的实例方法class被定义为returnrb_class_real(CLASS_OF(obj));。有什么方法可以从Ruby中使用它? 最佳答案 我花了一些时间研究irb并想出了这个:classBasicObjectdefclassklass=class这将为任何从BasicObject继承的对象提供一个#class您可以调用的方法。编辑评论中要求的进一步解释:假设你有对象
我在非Rails项目中使用ActiveRecord。在Rails中,我可以这样做:config.time_zone='EasternTime(US&Canada)'config.active_record.default_timezone='EasternTime(US&Canada)'但如果我不使用rails,我该如何设置时区? 最佳答案 ActiveRecord::Base.default_timezone='EasternTime(US&Canada)' 关于ruby-没有轨道的A
在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc