PDA

View Full Version : مکانهای نزدیک توسط location و بات تلگرام



learn30t
شنبه 03 تیر 1396, 00:34 صبح
سلام و خسته نباشید خدمت تمام دوستان گل
2تا سوال دارم
1- شرکت ما با یه سری مراکز خرید توی اهواز قرارداد داره ، حالا میخوام کاربر هر کجای شهر بود نزدیک ترین مرکز رو بهش معرفی کنه ، اینم بگم که مختصات همه مراکز رو دارم میشه بگید چطوری میشه این کار رو کرد (ربات آمادست فقط نمیدونم چطوری مکانهای نزدیک رو توی دیتابیس بررسی کنم
2- چطوری میشه تمام اعضای کانال تلراممون رو در بیارم ، (یک شخص رو بلدم ، لیست کلی رو میخوام )
با تشکر

afshines
سه شنبه 06 تیر 1396, 18:17 عصر
سلام برای بدست آوردن مکانهای نزدیک در حد ترافیک کم اگه سایتت تون داره از این کد استفاده کنید ولی برای ترافیک زیاد توصیه نمیکنم چون توان پردازشی بالا میخواد برای اون سیستمها دیگه وجود داره که استفاده کنید ولی اگه خودتون میخواد کد php بزنید این جواب میده تست شده .









public function getByNearFilterAcvJoin($table1,$table2,$connect,$l imit,$offset,$order_to,$order,$needs,$where=null,$ condition,$lat,$long,$km_per_degree ,$distance,Silex\Application $app)
{
$sql = "SELECT $needs "; $sql .=",".$km_per_degree." * ACOS( COS( RADIANS( ".$lat." ) ) * COS( RADIANS( ".$table1."._lat ) ) * COS( RADIANS( ".$table1."._long ) - RADIANS( ".$long." ) ) + SIN( RADIANS( ".$lat." ) ) * SIN( RADIANS( ".$table1."._lat ) ) ) AS distance ";

$sql .= "FROM $table1 INNER JOIN $table2 ON $table1.$connect = $table2.$connect ";

$sql .= "WHERE ";
$sql .= "active=1";
if(isset($where))
{ $sql .= " AND ( ";
$c = count($where);
$i = 0;
foreach ($where as $key => $value)
{
if(is_numeric($value))
$sql.=$key." = :".$key;
else
$sql.=$key." LIKE CONCAT('%',:".$key.",'%')";
$i++;
if($c!=$i) $sql.=" ".$condition." ";
}
$sql.=" )";
}
$sql .= " HAVING (distance < ".$distance.")";
$sql .=" ORDER BY $order $order_to ";
if($limit>0)
$sql .= "LIMIT $limit OFFSET $offset";
if(isset($where))
$row = $app['db']->fetchAll($sql , $where);
else
$row = $app['db']->fetchAll($sql);
return $row;
}








درخواست نمونه










$this->entities = $this->store->near($request->get('limit',10),$request->get('offset',0),$request->get('order_to','DESC'),$request->get('order','distance'),'store_id,store_name,gname ,state,city,logo,header_image,we_score,users_score ,visit,_lat,_long',$where,$request->get('condition','OR'),$request->get('_lat'),$request->get('_long'),$request->get('km_per_degree',3959) ,$request->get('distance',0.310685596), $app);
$items = $this->db->getByNearFilterAcvJoin($this->table_name,'groups','group_id',$limit,$offset,$ord er_to,$order,$needs,$where,$condition,$lat,$long,$ km_per_degree ,$distance ,$app);









ببخشید فقط یه خورده شلوغه چون برای یه پروژه قدیمی silex بود اصلش همون query که زدم

learn30t
پنج شنبه 08 تیر 1396, 21:36 عصر
سلام برای بدست آوردن مکانهای نزدیک در حد ترافیک کم اگه سایتت تون داره از این کد استفاده کنید ولی برای ترافیک زیاد توصیه نمیکنم چون توان پردازشی بالا میخواد برای اون سیستمها دیگه وجود داره که استفاده کنید ولی اگه خودتون میخواد کد php بزنید این جواب میده تست شده .









public function getByNearFilterAcvJoin($table1,$table2,$connect,$l imit,$offset,$order_to,$order,$needs,$where=null,$ condition,$lat,$long,$km_per_degree ,$distance,Silex\Application $app)
{
$sql = "SELECT $needs "; $sql .=",".$km_per_degree." * ACOS( COS( RADIANS( ".$lat." ) ) * COS( RADIANS( ".$table1."._lat ) ) * COS( RADIANS( ".$table1."._long ) - RADIANS( ".$long." ) ) + SIN( RADIANS( ".$lat." ) ) * SIN( RADIANS( ".$table1."._lat ) ) ) AS distance ";

$sql .= "FROM $table1 INNER JOIN $table2 ON $table1.$connect = $table2.$connect ";

$sql .= "WHERE ";
$sql .= "active=1";
if(isset($where))
{ $sql .= " AND ( ";
$c = count($where);
$i = 0;
foreach ($where as $key => $value)
{
if(is_numeric($value))
$sql.=$key." = :".$key;
else
$sql.=$key." LIKE CONCAT('%',:".$key.",'%')";
$i++;
if($c!=$i) $sql.=" ".$condition." ";
}
$sql.=" )";
}
$sql .= " HAVING (distance < ".$distance.")";
$sql .=" ORDER BY $order $order_to ";
if($limit>0)
$sql .= "LIMIT $limit OFFSET $offset";
if(isset($where))
$row = $app['db']->fetchAll($sql , $where);
else
$row = $app['db']->fetchAll($sql);
return $row;
}








درخواست نمونه










$this->entities = $this->store->near($request->get('limit',10),$request->get('offset',0),$request->get('order_to','DESC'),$request->get('order','distance'),'store_id,store_name,gname ,state,city,logo,header_image,we_score,users_score ,visit,_lat,_long',$where,$request->get('condition','OR'),$request->get('_lat'),$request->get('_long'),$request->get('km_per_degree',3959) ,$request->get('distance',0.310685596), $app);
$items = $this->db->getByNearFilterAcvJoin($this->table_name,'groups','group_id',$limit,$offset,$ord er_to,$order,$needs,$where,$condition,$lat,$long,$ km_per_degree ,$distance ,$app);









ببخشید فقط یه خورده شلوغه چون برای یه پروژه قدیمی silex بود اصلش همون query که زدم



سلام
شرمنده ، مشکل من چیز دیگه ای یه ، مشکل من اون دکمه ای تو تلگرام که با کلیک روش برات مختصات کاربر رو میفرسته (توی ساخت دکمه ارسال موقعیت مشکل دارم)

afshines
جمعه 09 تیر 1396, 17:59 عصر
سلام
شرمنده ، مشکل من چیز دیگه ای یه ، مشکل من اون دکمه ای تو تلگرام که با کلیک روش برات مختصات کاربر رو میفرسته (توی ساخت دکمه ارسال موقعیت مشکل دارم)


من از سوالتون چیز دیگه متوجه شدم راجب این موضوع یادم نیست ولی احتمالا یه مقداری باید اون سمت از کاربر سوال کنه بعد بفرسته یه فیلد هست باید روی true ست کنید به نام request_location مقدار بازگشتی این طور بدست میاد message.location.latitude, message.location.longitude
این لینک ببینید قسمت location
https://core.telegram.org/bots/api#message
البته باید ورژن موبایلی تلگرام باشه