3

因此,对于学校的一个项目,我试图模拟学生住在我们镇上的地方,因为由于隐私问题显然无法获得官方数据。我开始寻找一个可以通过邮政编码、半径或县工作的生成器,但我找不到任何(商业或免费)我希望它是免费的,但我可能能够获得一些许可证资金. 如果我找到随机生成器,它们不能仅限于邮政编码或城市来随机生成真实地址。

我在这里找到了一个好主意:https ://stackoverflow.com/a/12289969/1778542

在此基础上,我会选择市中心的经纬度坐标,找出郊区坐标来创建一个平面,然后在平面内随机生成经纬度坐标,将它们反馈给谷歌,让谷歌为其近似地址。提出的一个问题(我尽量避免)是 Google 不使用经过验证的地址,而是使用近似值。

有没有人暗示在哪里可以找到这样的生成器或使用 GMaps 的更时尚的方式?

太感谢了!

全科医生

4

1 回答 1

0

我在我的一个 Laravel Seeder 中使用此代码,只要您给它位置区域和城镇,它就会在罗马尼亚获得一个随机街道名称,它通过获取该区域的纬度和经度然后随机添加 2 公里的半径来工作,之后,它向 google api 发出另一个请求,并从中提取随机街道名称。

我不知道这是否对您有帮助,调整此代码可以生成一个真实地址,前提是您提供第一个好位置来查看;

这是代码:

 protected function getRandomStreetNameFromCity($judet, $city){
        $kmRange = 2;
        $initalLocation = [];
        $randomLocation= [];
        $randomKmval = mt_rand(1, $kmRange) / mt_getrandmax();

        // Poor Man Lat and Lng 
        //Latitude: 1 deg = 110.574 km
        //Longitude: 1 deg = 111.320*cos(latitude) km

                $guzzelCl = new Client();
        $guzelReq = $guzzelCl->request('GET', 'http://maps.googleapis.com/maps/api/geocode/json?address=Romania,'.$judet.','.$city.'&sensor=false', [
            'verify' => false,   
        ]);



        if($guzelReq->getStatusCode() == 200){
           $arrJson = json_decode($guzelReq->getBody(), true);
            while (count($arrJson['results']) <= 0){
            $judet= $this->getNewJudet();
            $city = $this->getNewOras();
            $guzelReq = $guzzelCl->request('GET', 'http://maps.googleapis.com/maps/api/geocode/json?address=Romania,'.$judet.','.$city.'&sensor=false', [
            'verify' => false,   
        ]);
         $arrJson = json_decode($guzelReq->getBody(), true);      
           }


           $initalLocation = $arrJson['results'][0]['geometry']['location'];
           }



        $plusMinus = $this->generateRandomString(1);


        $randomExp = [ 1 => $tempLat = eval("return (1 / (110.574 ".$plusMinus." ".$randomKmval." )+ ".$initalLocation['lat']." );"),
            2 => eval('return ('.$initalLocation['lng'].' '.$plusMinus.' 1/111.320*cos($tempLat));'),
            ];

        $guzelReq = $guzzelCl->request('GET', 'http://maps.googleapis.com/maps/api/geocode/json?latlng='.$randomExp[1].','.$randomExp[2], [
            'verify' => false,   
        ]);
        return explode(',', json_decode($guzelReq->getBody(), true)['results'][0]['formatted_address'])[0];



 }   


 protected function getNewJudet(){
     //This is a administrative type of location named 'judet' Romania is divided in a number bellow 50 of this  
     return array_rand($this->judetOras, 1);
 }

 protected function getNewOras(){
     //This is a Town String
     return $this->judetOras[$iterateJud = array_rand($this->judetOras, 1)][array_rand($this->judetOras[$iterateJud], 1)];
 }


 protected function generateRandomString($length = 10) {
    $characters = '-+';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}   
于 2016-04-04T13:13:31.620 回答