zoukankan      html  css  js  c++  java
  • SQL判断经纬度在矩形内

    1,将城市地图拆分等距拆分为矩形

    数据结构如图:

    2.查看高德JS API (点是否在多边形内)核心代码:

    a=[114.069564,22.545774];
    b=[
        [114.067595,22.552082],
        [114.077322,22.552082],
        [114.077322,22.543099],
        [114.067595,22.543099],
    ];
    c=true
    
    lf: function(a, b, c) {
        var d = a[0];
        a = a[1];
        var f = !1, g, h, k, l, m = b.length, n = 0;
        for (l = m - 1; n < m; l = n,
        n += 1) {
            var p = !1;
            g = b[n][0];
            h = b[n][1];
            k = b[l][0];
            l = b[l][1];
            if (g === d && h === a || k === d && l === a)
                return c ? !0 : !1;
            if (h < a === l >= a) {
                g = (k - g) * (a - h) / (l - h) + g;
                if (d === g)
                    return c ? !0 : !1;
                p = d < g
            }
            p && (f = !f)
        }
        return f
    }

    3.将js代码解析为SQL (未考虑使用函数,因在其他平台上使用)

    SELECT * FROM map_grid a
    WHERE 
    (CASE 
        WHEN 
    				(a.first_longitude = 114.069564 and a.first_latitude=22.545774) or 
    				(a.second_longitude = 114.069564 and a.second_latitude=22.545774)  or 
    				(a.third_longitude = 114.069564 and a.third_latitude=22.545774)  or 
    				(a.fourth_longitude = 114.069564 and a.fourth_latitude=22.545774) 
    		THEN TRUE
    
    		WHEN (a.first_latitude<22.545774)=(a.fourth_latitude>=22.545774) 
    				AND (a.fourth_longitude-a.first_longitude)*(22.545774-a.first_latitude)/(a.fourth_latitude-a.first_latitude)+ a.first_longitude = 114.069564
    		THEN TRUE
    
    		WHEN (a.second_latitude<22.545774)=(a.first_latitude>=22.545774) 
    				AND (a.first_longitude-a.second_longitude)*(22.545774-a.second_latitude)/(a.first_latitude-a.second_latitude)+ a.second_longitude = 114.069564
    		THEN TRUE
    
    		WHEN (a.third_latitude<22.545774)=(a.second_latitude>=22.545774) 
    				AND (a.second_longitude-a.third_longitude)*(22.545774-a.third_latitude)/(a.second_latitude-a.third_latitude)+ a.third_longitude = 114.069564
    		THEN TRUE
    
    		WHEN (a.fourth_latitude<22.545774)=(a.third_latitude>=22.545774) 
    				AND (a.third_longitude-a.fourth_longitude)*(22.545774-a.fourth_latitude)/(a.third_latitude-a.fourth_latitude)+ a.fourth_longitude = 114.069564
    		THEN TRUE
    
    		WHEN(
    					(
    						CASE
    						WHEN (a.first_latitude<22.545774)=(a.fourth_latitude>=22.545774) 
    								AND (a.fourth_longitude-a.first_longitude)*(22.545774-a.first_latitude)/(a.fourth_latitude-a.first_latitude)+ a.first_longitude > 114.069564
    						THEN 1
    						ELSE 0 END
    					)+(
    						CASE
    						WHEN (a.second_latitude<22.545774)=(a.first_latitude>=22.545774) 
    								AND (a.first_longitude-a.second_longitude)*(22.545774-a.second_latitude)/(a.first_latitude-a.second_latitude)+ a.second_longitude > 114.069564
    						THEN 1
    						ELSE 0 END
    					)+(
    						CASE
    						WHEN (a.third_latitude<22.545774)=(a.second_latitude>=22.545774) 
    								AND (a.second_longitude-a.third_longitude)*(22.545774-a.third_latitude)/(a.second_latitude-a.third_latitude)+ a.third_longitude > 114.069564
    						THEN 1
    						ELSE 0 END
    					)+(
    						CASE
    						WHEN (a.fourth_latitude<22.545774)=(a.third_latitude>=22.545774) 
    								AND (a.third_longitude-a.fourth_longitude)*(22.545774-a.fourth_latitude)/(a.third_latitude-a.fourth_latitude)+ a.fourth_longitude > 114.069564
    						THEN 1
    						ELSE 0 END
    					) 
    				) % 2=1
    			THEN TRUE
    
    			ELSE FALSE
    			END
    )
    

    4.执行结果

  • 相关阅读:
    第三方驱动备份与还原
    Greenplum 解决 gpstop -u 指令报错
    yum安装(卸载)本地rpm包的方法(卸载本地安装的greenplum 5.19.rpm)
    Java JUC(java.util.concurrent工具包)
    netty 详解(八)基于 Netty 模拟实现 RPC
    netty 详解(七)netty 自定义协议解决 TCP 粘包和拆包
    netty 详解(六)netty 自定义编码解码器
    netty 详解(五)netty 使用 protobuf 序列化
    netty 详解(四)netty 开发 WebSocket 长连接程序
    netty 详解(三)netty 心跳检测机制案例
  • 原文地址:https://www.cnblogs.com/stones/p/6502622.html
Copyright © 2011-2022 走看看