用户在编辑框内输入经纬度,点按钮,搜一些东西,我不想麻烦做成限定输入的那种,
想做成类似Google Maps搜索框那样,就一个编辑框,输入
纬度,经度
搜,就行了。
两者
中间可以用中英文逗号、空格隔开但是我这里的经纬度,用户可以以小数、度分秒等方式输入如
113.123, 23.444
113度12分25.6秒, 23度12分11.6秒, 南纬的时候 -23度12分11.6秒 即可
113:12:25.123, 23:15:16.111
113°12′25.123″, 23°12′16.111″这些写法都可以,最终都转换成两个小数,怎么解析呀,救高手

解决方案 »

  1.   

    我现在做的是demo,可以解析就好,不需要太复杂的判断
    所以,后三种应该用一种方法就行了,即使用户输入成了113张12李25.6王,也能给他解析出来得了。
      

  2.   

    var s="113度12分25.6秒, 23度12分11.6秒";
    var a= s.split(",");for(var i=0;i<a.length;i++ ){
    alert(a[i].replace(/^\s|\s$/i,'').match(/(-?[0-9\.]+?)[^0-9\.]+([0-9\.]*?)[^0-9\.]+([0-9\.]+?)/i));
    }
      

  3.   

    上面的结果不太准确。<Meta http-equiv="content-type" content="text/html; charset=utf-8">
    <META NAME="Author" CONTENT="theforever(碧海情天),赵亮">
    <meta http-equiv="email" content="theforever·163.com">
    <meta http-equiv="blog" content="blog.csdn.net/theforever">
    <script type="text/javascript">
    var s="113°12′25.123, 23°12′16.111";
    var a= s.split(",");
    for(var i=0;i<a.length;i++ ){
    alert(a[i].replace(/[^\d]/g,'|'));
    }
    </script>
    这样的结果更准确。对转换后的结果可以再次split("|"),根据结果的length可以判断是哪种类型,然后进行相应的数据运算处理。
      

  4.   


    //可以匹配下面的几种情况
    /*
    X
    X.Y
    X度
    X度Y分
    X度Y分Z秒
    X度Y分Z.W秒
    X:Y
    X:Y:Z
    X:Y:Z.W

    X°Y′
    X°Y′Z″
    X°Y′Z.W″*/
    function check(inputSrc) {
    var reg = [
    /^([0-9]{1,3})((?:[\.])([0-9]{1,3})?)$/g, 
    //X.Y X=$1,Y=$3
    /^([0-9]{1,3})度((([0-9]{1,2})分((([0-9\.]+)秒)?))?)$/g,
    //X度Y分Z.W秒 X=$1,Y=$4,Z.W=$7
    /^([0-9]{1,3})(?:\:)((([0-9]{1,2})(?:\:)((([0-9\.]+))?))?)$/g,
    //X:Y:Z.W X=$1,Y=$4,Z.W=$7
    /^([0-9]{1,3})°((([0-9]{1,2})′((([0-9\.]+)″)?))?)$/g //X°Y′Z.W″X=$1,Y=$4,Z.W=$7
    ];
    var valid = false;//是否有效
    for(var i=0,len=reg.length;i<len;i++) {
    if(reg[i].test(inputSrc)) {//获得了匹配,格式正确
    if(i==0) {
    return parseFloat(RegExp.$1 + '.'+ (RegExp.$3==''?0:RegExp.$3));//返回转换后的小数
    } else {
    var degree = RegExp.$1;//度
    var minute = RegExp.$4==''?0:RegExp.$4;//分
    var second = RegExp.$7;//秒
    if(second!='') {//
    if(reg[0].test(second)) {//判断秒是否符合 X.Y的格式,排除不是整数或者小数的情况
    second = parseFloat(RegExp.$1 + '.'+ (RegExp.$3==''?0:RegExp.$3));
    } else {
    continue;//输入的无效,需要进行下一个正则匹配
    }
    } else {
    second = 0;
    }
    //这里需要进行 度分秒 单位换算
    //var XXX = degree + ......
    return XXX;
    }
    }
    }
    if(valid==false) return false;//说明输入的都不是符合格式的数据}
    大概就这样了,正则应该没问题,楼主自己完善试试
      

  5.   

    reg[2] /^([0-9]{1,3})(?:\:)((([0-9]{1,2})(?:\:)((([0-9\.]+))?))?)$/g,改为 /^([0-9]{1,3})((?:\:)(([0-9]{1,2})(?:\:)((([0-9\.]+))?))?)$/g,
      

  6.   

    <script type="text/javascript">
    var s="113°12′25.123, 23°12′16.111";
    var a= s.split(",");
    for(var i=0;i<a.length;i++ ){
        alert(a[i].replace(/[^\d]/g,'|'));
    }
    </script>我觉得这个就行啊
      

  7.   

    更正下:
    reg[0] = /^([0-9]{1,3})(((?:[\.])([0-9]{1,3}))?)$/, 
            //X.Y X=$1,Y=$4
    里面的 RegExp.$3改为 RegExp.$4
    把4个正则的选项 g 都去掉,否则容易第一次找到,第二次就找不到了解释一下:(((?:[\.])([0-9]{1,3}))?) 这个正则表示 匹配 ((?:[\.])([0-9]{1,3})) 1次或者多次,整体的也就是匹配 X 或者 X.Y
      

  8.   

    (((?:[\.])([0-9]{1,3}))?) 这个正则表示 匹配 ((?:[\.])([0-9]{1,3})) 1次或者0次,整体的也就是匹配 X 或者 X.Y
      

  9.   

    //解析经纬度字符串,返回经纬度
    function parseLngLat(strLngLat) {
        var strList = [];
        var sum = 0;
        //先解析出用逗号或空格分开的经纬度
        strList = strLngLat.split(new RegExp(",|,|[ +]"));
        var gLngLat;
        if (strLngLat.match(/度|°|:/) != null/*.length > 0*/) {
            var strDMS = [];
            strDMS = strList[0].split(/度|分|:|°|′/g, 3); //match(/\d+/g);
            var numDMS = [];
            //strDMS可能只有“113度”这种情况,后边没有的补0
            for (var i = 0; i < 3; i++) {
                if (strDMS[i] == null) {
                    numDMS[i] = 0;
                } else {
                    numDMS[i] = parseFloat(strDMS[i]);
                }
            }
            var lng = numDMS[0] + numDMS[1] / 60 + numDMS[2] / 3600;
            strDMS = strList[1].split(/度|分|:|°|′/g, 3); //.match(/\d+/g);
            //strDMS可能只有“113度”这种情况,后边没有的补0
            //strDMS可能只有“113度”这种情况,后边没有的补0
            for (i = 0; i < 3; i++) {
                if (strDMS[i] == null) {
                    numDMS[i] = 0;
                } else {
                    numDMS[i] = parseFloat(strDMS[i]);
                }
            }
            var lat = numDMS[0] + numDMS[1] / 60 + numDMS[2] / 3600;        gLngLat = new google.maps.LatLng(lat, lng);
            
        } else {
            gLngLat = new google.maps.LatLng(parseFloat(strList[1]), parseFloat(strList[0]));
        }
        return gLngLat;}