【问题标题】:Extract lat/long coordinates from a php string从 php 字符串中提取纬度/经度坐标
【发布时间】:2011-06-14 17:44:12
【问题描述】:

我需要使用 php 从字符串中提取经纬度坐标。字符串将始终被格式化为:

"(42.32783298989135, -70.99989162915041)"

但是,每个值的长度会因用途而异。提取值的最佳方法是什么?谢谢!

【问题讨论】:

    标签: php string extract


    【解决方案1】:

    您可以使用 sscanf 来执行此操作:

    sscanf($string, '"(%f, %f)"', $lat, $lng);
    

    测试:

    php > sscanf('"(42.32783298989135, -70.99989162915041)"', '"(%f, %f)"', $lat, $lng);
    php > var_dump($lat, $lng);
    float(42.327832989891)
    float(-70.99989162915)
    

    【讨论】:

    • 简洁的解决方案,但请注意,这会导致一些精度损失。
    • @mfonda:你能详细说明一下吗?你的意思是如果有更多的数字,精度可能会丢失?
    • @greg0ire:例如查看上面的输出:原始输入的纬度为“42.32783298989135”,但使用浮点数只剩下“42.327832989891”(缺少最后 3 位数字,具体取决于申请可能很重要)。有关详细信息,请参阅us3.php.net/manual/en/language.types.float.php
    • @mfonda - 42.32783298989135, -70.99989162915041 纬度误差1.111纳米,经度误差0.824纳米(不确定度1.383纳米); 42.327832989891, 70.99989162915 的纬度误差为 111.080 纳米,经度误差为 82.424 纳米(不确定度为 138.320 纳米)......是的,我的意思是纳米......对于大多数用途来说,舍入误差的幅度应该足够准确。
    • @mfonda - 虽然在使用浮点数时不可避免地会出现一定程度的错误,但 var_dump 并不是一个特别好的衡量标准,因为它会在为 var_dump 转换为字符串时使用 PHP 的精度设置展示;并且最后三位数字(在引用的示例中)由于转换为字符串而不是 PHP 中浮点数的精度而丢失。将精度设置为 16,即使在 32 位系统上,将浮点数转换为字符串时也会正确显示那些丢失的数字。
    【解决方案2】:
    $withoutParentheses = substr($string, 1, -1);
    $coordinates = explode(', ', $coordinates);
    $longitude = floatval($coordinates[0]);
    $latitude = floatval($coordinates[1]);
    

    【讨论】:

    • 你也可以使用substr代替trim。
    【解决方案3】:

    您可以使用正则表达式从括号中提取数字,然后使用explode 命令将数字拆分为一个数组。

    您的正则表达式将类似于

    /(-?[0-9]+.[0-9]+, -?[0-9]+.[0-9]+)/
    

    您的爆炸命令的分隔符将是一个逗号。

    【讨论】:

    • 尽可能避免使用正则表达式。
    • 常重复的口头禅:有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。
    【解决方案4】:

    这是我自己想出来的:

    function LatFromString($mCenterString){
        //(42.32783298989135, -70.99989162915041)
        $mLatLong = explode(",", $mCenterString);
        $mLat = '';
        if(count($mLatLong) == 2){
            $mLat = substr($mLatLong[0], 1);
        }
        return $mLat;
    }
    function LongFromString($mCenterString){
        //(42.32783298989135, -70.99989162915041)
        $mLatLong = explode(",", $mCenterString);
        $mLat = '';
        if(count($mLatLong) == 2){
            $mLong = substr($mLatLong[1], 0, -1);
        }
        return $mLong;
    }
    

    这看起来怎么样?

    【讨论】:

      【解决方案5】:

      你可以这样做:

                  $str = "(42.32783298989135, -70.99989162915041)";
      
                  function extractlatlong($str){
                      $latlong = explode(",",$str);
      
                      if(count($latlong) == 2){
                          $lat = preg_replace("%[^0-9.]%","",$latlong[0]);
                          $long = preg_replace("%[^0-9.]%","",$latlong[1]);
                          return array("lat"=>$lat,"long"=>$long);
                      } else {
                          return NULL;
                      }
                  }
      
                  print_r(extractlatlong($str));
      

      【讨论】:

        【解决方案6】:

        如果您想使用sscanf()(我可能会),但又不想因为将数值转换为浮点数而失去任何精度,那么请使用几个否定字符类。您不必匹配尾随的 ) 来提取您需要的内容。

        代码:(Demo)

        $latlon = "(42.32783298989135, -70.99989162915041)";
        sscanf($latlon, '(%[^,], %[^)]', $lat, $lon);
        var_export([$lat, $lon]);
        

        输出为字符串数组:

        array (
          0 => '42.32783298989135',
          1 => '-70.99989162915041',
        )
        

        或者,如果您只想要两个值的索引数组,如上面的输出:

        var_export(sscanf($latlon, '(%[^,], %[^)]'));
        

        【讨论】:

          猜你喜欢
          • 2021-06-27
          • 1970-01-01
          • 1970-01-01
          • 2013-09-04
          • 1970-01-01
          • 2020-05-04
          • 1970-01-01
          • 1970-01-01
          • 2019-08-15
          相关资源
          最近更新 更多