MySQL中判斷乙個點是否落在多邊形內

2021-06-28 03:57:53 字數 2041 閱讀 9633

關於地理空間資料,經常需要處理兩個空間資料的關聯關係。有很多種方法可以處理,通過編寫程式演算法,或者是呼叫資料庫中對應的function。在mysql資料庫中,做了詳細的介紹,但是它並沒有真正的實現多邊形(5.6版本之前),本文以判斷乙個點是否落在多邊形內的主題,加以簡單的擴充套件。

首先,建立一張簡單的地理資料表,

create table `ci_special_zone` (  

`id` int(11) not null auto_increment,  

`ploygongeo` text not null,  

primary key  (`id`)  

) engine=myisam default charset=utf8; 

並插入幾條資料

insert into ci_special_zone (ploygongeo) values('polygon((113.547 22.186,113.549 22.186,113.549 22.188, 113.547 22.188,113.547 22.186))');  

insert into ci_special_zone (ploygongeo) values('polygon((112.547 21.186,112.549 212.186,112.549 21.188, 112.547 212.188,112.547 21.186))'); 

建立function,

delimiter //  

create function mywithin(p point, poly polygon) returns int(1) deterministic  

begin  

declare n int default 0;  

declare px decimal(9,6);  

declare py decimal(9,6);  

declare ls linestring;  

declare poly1 point;  

declare poly1x decimal(9,6);  

declare poly1y decimal(9,6);  

declare poly2 point;  

declare poly2x decimal(9,6);  

declare poly2y decimal(9,6);  

declare i int default 0;  

declare result int(1) default 0;  

set px = x(p);  

set py = y(p);  

set ls = exteriorring(poly);  

set poly2 = endpoint(ls);  

set poly2x = x(poly2);  

set poly2y = y(poly2);  

set n = numpoints(ls);  

while i ( poly2y - poly1y ) * ( px - poly1x ) / ( poly2x - poly1x ) + poly1y ) ) then  

set result = !result;  

end if;  

set poly2x = poly1x;  

set poly2y = poly1y;  

set i = i + 1;  

end while;  

return result;  

end;  

//  

delimiter ; 

最後,執行如下的sql語句

select substring(ploygongeo,10,length(ploygongeo)-11) from ci_special_zone  

where mywithin(polygonfromtext('point(113.547 22.186)'),polygonfromtext(ploygongeo))>0 limit 0,1 

座標點113.547 22.186是經緯度,若有返回值,則表示座標點落在所在的區間。

如何判斷乙個指定的經緯度點是否落在乙個多邊形內

1 理論支援 如果從需要判斷的點出發的一條射線與該多邊形的焦點個數為奇數,則該點在此多邊形內,否則該點在此多邊形外。射線不能與多邊形頂點相交 2 程式設計思路 該程式的思路是從a點出發向左做一條水平射線 平行於x軸,向x軸的反方向 判斷與各邊是否有焦點。dlon1,dlon2,dlat1,dlat2...

判斷乙個點是否在RotatedRect中

opencv函式pointpolygontest c double pointpolygontest inputarray contour,point2f pt,bool measuredist 用於判斷乙個點是否在輪廓中 當measuredist設定為true時,若返回值為正,表示點在輪廓內部,返...

判斷乙個點是否在RotatedRect中

opencv函式pointpolygontest c double pointpolygontest inputarray contour,point2f pt,bool measuredist 用於判斷乙個點是否在輪廓中 當measuredist設定為true時,若返回值為正,表示點在輪廓內部,返...