经纬度查询所在省市(China Only)

By money at 2021-06-19 • 0人收藏 • 597人看过
import win;
import console;
import gdip;

console.open();

//chinaArea.tab数据来源:https://geo.datav.aliyun.com/areas_v2/bound/100000_full.json
var china = string.load("chinaArea.tab");
china = eval(china);
			
//生成gdip path数组
function createProvinceRgns(){
	var paths={};
	for(h=1;#china.features;1){
    	var prov = china.features[h];
    	var pPath = gdip.assert2(  gdip.CreatePath (0 )  );
    	for(i=1;#prov.geometry.coordinates;1){
			var tab = prov.geometry.coordinates[i]
			
			if(prov.geometry.type=="MultiPolygon"){
				for(j=1;#tab;1){
					var tab1 = tab[j];
					var pts={}
					for(k=1;#tab1;1){
						var tab2 = tab1[k];
						table.push(pts, tab2[1] , tab2[2])
					}
					gdip.assert2( gdip.AddPathPolygon(pPath ,{ float points[] = pts }, #pts/2  ) ); 
				}
			}else if(prov.geometry.type=="Polygon"){
				var pts={}
				for(j=1;#tab;1){
					var tab1 = tab[j];
					table.push(pts, tab1[1], tab1[2])
				}
				gdip.assert2( gdip.AddPathPolygon(pPath ,{ float points[] = pts }, #pts/2  ) ); 
			}
			table.push(paths, {path=pPath; province=prov.properties.name})
		}
	}
	return paths; 
}
var paths = createProvinceRgns();

var IsVisiblePathPoint = ::Gdiplus.api("GdipIsVisiblePathPoint","int(PTR path, float x, float y, pointer graphics, bool &b)");

//只演示定位省,如需定位市,参考chinaArea.tab数据

var x = 110.322925;
var y = 24.930706;

for(i=1;#paths;1){
	var tab = paths[i];
	//console.dump(tab)
	var b=false;
	
	var ret,b = IsVisiblePathPoint(tab.path, x, y)
	if(b){
		console.dump(tab.province)
		break
	}
}


win.loopMessage();

chinaArea.7z

注意事项:坐标保持小数就好,如果坐标*1000000转成整数,数值太大会导致gdip函数卡死

1 个回复 | 最后更新于 2021-06-20
2021-06-20   #1

感谢分享

登录后方可回帖

登 录
信息栏
公 告:

专注分享

谢绝纯提问

谢谢合作!
本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...