關於地理空間資料,經常需要處理兩個空間資料的關聯關係。有很多種方法可以處理,通過編寫程式演算法,或者是呼叫資料庫中對應的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時,若返回值為正,表示點在輪廓內部,返...