Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

[Feature]建议:自动生成经纬度信息 #1

Open
eng-cc opened this issue Jan 26, 2020 · 21 comments
Open

[Feature]建议:自动生成经纬度信息 #1

eng-cc opened this issue Jan 26, 2020 · 21 comments
Labels
kind/feature Category issues or prs related to feature request.

Comments

@eng-cc
Copy link

eng-cc commented Jan 26, 2020

同步过程中可以根据地址文字处理出经纬度信息,方便后续数据分析和可视化

@frank-zsy
Copy link
Contributor

非常好的建议!

@frank-zsy frank-zsy added the kind/feature Category issues or prs related to feature request. label Jan 28, 2020
@dz85 dz85 changed the title 建议:自动生成经纬度信息 [Feature]建议:自动生成经纬度信息 Jan 28, 2020
@tyisme614
Copy link
Contributor

这个工具接口我来写吧,打算用百度的正逆地理编码来实现。

@nwljy
Copy link

nwljy commented Jan 28, 2020

@nwljy
Copy link

nwljy commented Jan 28, 2020

建议高德也弄了

@wangzhen11aaa
Copy link

https://restapi.amap.com/v3/geocode/geo
测试通过了吗?

@nwljy
Copy link

nwljy commented Jan 28, 2020

这本来就是高德的api

@tyisme614
Copy link
Contributor

嗯 好的

@wangzhen11aaa
Copy link

这个有访问的上限次数吗?如果有上限,我们可否把这些数据存储到一个小数据库。

@nwljy
Copy link

nwljy commented Jan 28, 2020 via email

@wangzhen11aaa
Copy link

毕竟高德api应该也是商用的,我们目前是不是只对经纬度有需求?不用每次都去访问他的api。如果需要账号,我们可以搜集一些账号,分省市把数据弄下来。然后导入到我们可用的数据库。

@nwljy
Copy link

nwljy commented Jan 28, 2020

1000 个人开发者

@nwljy
Copy link

nwljy commented Jan 28, 2020

先走数据库 查询一下是否有值,没有走接口查询相关信息

@nwljy
Copy link

nwljy commented Jan 28, 2020

写错 6000次/日

@wangzhen11aaa
Copy link

我们这里的地址信息不同于快递,目前精确到县就可以吧。全国县级行政区划单位有2845个,其中市辖区963个、县级市382个、县1329个。如果有缓存,应该没有问题的。不需要单独存储。

@wangzhen11aaa
Copy link

我觉得可以使用高德的API。理论上位置精确到县,需要3个账号就能够了。大家觉得怎么样?如果可以,nwljy你去联系一下 这个项目的架构同学?

@nwljy
Copy link

nwljy commented Jan 28, 2020

配置保存在config目录的config.default.ts,然后调用 ctx.app.config.

var XMLHttpRequest=null

var request=null
/**

  • Open the connection. Currently supports local server requests.
  • @param string method Connection method (eg GET, POST)
  • @param string url URL for the connection.
  • @param boolean async Asynchronous connection. Default is true.
  • @param string user Username for basic authentication (optional)
  • @param string password Password for basic authentication (optional)
    */
    var requestDatautils = {

getHttpReponseData:function(option,responseCallBack){
XMLHttpRequest= require("xmlhttprequest").XMLHttpRequest;
var xmlhttp = new XMLHttpRequest();

if(option.requestData!=null){
    console.dir("send-----------"+option.requestData);
   var url=option.url+"?"+encodeFormData(option.requestData);
   console.log(url);
    xmlhttp.open("GET",url, option.asynch,option.user, option.password);
    
}else{
    xmlhttp.open("GET",option.url, option.asynch,option.user, option.password);
   
}
if(option.headers!=null)  {
    for(var key in option.headers)  {
        if(option.headers.hasOwnProperty(key)){
            xmlhttp.setRequestHeader(key,option.headers[key]);
        }
    }

}

xmlhttp.onreadystatechange = function(){
	//debugger;
	//console.log(xmlhttp.readyState);
	//console.log(xmlhttp.status);
		if(xmlhttp.readyState == 4){
				if(xmlhttp.status == 200){	
                    return responseCallBack(xmlhttp.responseText);
				}else if(xmlhttp.status == 404){
					return responseCallBack(xmlhttp.responseText);
				}else if(xmlhttp.status == 0){	
					return responseCallBack(xmlhttp.responseText);
				}
		}
};
xmlhttp.send(null);

},postHttpReponseData:function(option,responseCallBack){
XMLHttpRequest= require("xmlhttprequest").XMLHttpRequest;
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", option.url, asynch,option.user, option.password);
if(option.headers!=null) {
for(var key in option.headers) {
if(option.headers.hasOwnProperty(key)){
xmlhttp.setRequestHeader(key,option.headers[key]);
}
}

}
if(option.requestData!=null){
console.dir("send-----------"+option.requestData)
xmlhttp.send(option.requestData)
}else{
console.log("send-----------")
xmlhttp.send(null);
}
xmlhttp.onreadystatechange = function(){
//debugger;
console.log(xmlhttp.readyState);
console.log(xmlhttp.status);
if(xmlhttp.readyState == 4){
if(xmlhttp.status == 200){
return responseCallBack(xmlhttp.responseText)
}else if(xmlhttp.status == 404){
return responseCallBack(xmlhttp.responseText)
}else if(xmlhttp.status == 0){
return responseCallBack(xmlhttp.responseText)
}
}
};

},getHttpsReponseData:function(option,responseCallBack){
XMLHttpRequest = require("xmlhttprequest-ssl").XMLHttpRequest;
var xmlhttp = new XMLHttpRequest();
if(option.requestData!=null){
console.dir("send-----------"+option.requestData)
var url=option.url+"?"+encodeFormData(option.requestData);
xmlhttp.open("GET",url, option.asynch,option.user, option.password);

}else{
    xmlhttp.open("GET",option.url, option.asynch,null,null);
    
    
}

if(option.headers!=null)  {
    for(var key in option.headers)  {
        if(option.headers.hasOwnProperty(key)){
            xmlhttp.setRequestHeader(key,option.headers[key]);
        }
    }

}
xmlhttp.onreadystatechange = function(){
//debugger;
console.log(xmlhttp.readyState);
console.log(xmlhttp.status);
if(xmlhttp.readyState == 4){
if(xmlhttp.status == 200){

                    return responseCallBack(xmlhttp.responseText)
				}else if(xmlhttp.status == 404){
					return responseCallBack(xmlhttp.responseText)
				}else if(xmlhttp.status == 0){	
					return responseCallBack(xmlhttp.responseText)
				}
		}
};
xmlhttp.send(null);

},postHttpsReponseData:function(option,responseCallBack){
XMLHttpRequest = require("xmlhttprequest-ssl").XMLHttpRequest;
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", option.url, option.asynch,option.user, option.password);
if(option.headers!=null) {
for(var key in option.headers) {
if(option.headers.hasOwnProperty(key)){
xmlhttp.setRequestHeader(key,option.headers[key]);
}
}

}
if(option.requestData!=null){
console.dir("send-----------"+option.requestData)
xmlhttp.send(option.requestData)
}else{
console.log("send-----------")
xmlhttp.send(null);
}

xmlhttp.onreadystatechange = function(){
	//debugger;
	console.log(xmlhttp.readyState);
	console.log(xmlhttp.status);
		if(xmlhttp.readyState == 4){
				if(xmlhttp.status == 200){	
                    return responseCallBack(xmlhttp.responseText)
				}else if(xmlhttp.status == 404){
					return responseCallBack(xmlhttp.responseText)
				}else if(xmlhttp.status == 0){	
					return responseCallBack(xmlhttp.responseText)
				}
		}
};

}
};

//将对象{find:"pizza",zipcode:01234,radius:"1km"}变成表单编码的格式 find=pizza&zipcode=01234$radius=1km 的形式
function encodeFormData(data){
if(!data) return "";
var pairs=[];
for(var name in data){
if(!data.hasOwnProperty(name)) continue; //跳过继承方法
if(typeof data[name] == "function") continue;//跳过方法
var value=data[name].toString();
name=encodeURIComponent(name.replace("%20","+"));
value=encodeURIComponent(value.replace("%20","+"));
pairs.push(name+"="+value);
}
return pairs.join('&');
}
module.exports =requestDatautils;

用到的npm i xmlhttprequest和 npm i xmlhttprequest-ssl

@nwljy
Copy link

nwljy commented Jan 28, 2020

@tyisme614

@tyisme614
Copy link
Contributor

先提交了高德的版本。百度的SN验证折腾了一下午没搞定,一直报错误代码211,SN校验错误。明天再找找解决方案。高德的版本比较简单,测试了一下坐标转换没什么问题。当然一个地址可能会对应多个坐标点,所以可以根据需要取所需要的坐标点,或者直接取第一个结果我觉得都OK。

@frank-zsy
Copy link
Contributor

为何同时需要两个版本的库一起做?用一个 API 库是不是就可以了?以及精确到坐标存储应该支持一下,方便做 POI 查询,我会在数据存入时校验,如果原来获取过经纬度而地址没有发变化的字段,则不再获取,这样访问频次不会很高,只有新数据和地址变更数据才会请求。

@tyisme614
Copy link
Contributor

已经提交PR,新的代码里增加了本地缓存,可以按照地址,将数据进行缓存。使用getLocationFromCache函数可以直接获取缓存的数据,如果返回null,则未找到该数据。缓存中的地址可进行模糊匹配,目前的模糊匹配算法比较简单,就是字符串相似度。
代码里也删除了百度API相关配置。

@frank-zsy
Copy link
Contributor

已经提交PR,新的代码里增加了本地缓存,可以按照地址,将数据进行缓存。使用getLocationFromCache函数可以直接获取缓存的数据,如果返回null,则未找到该数据。缓存中的地址可进行模糊匹配,目前的模糊匹配算法比较简单,就是字符串相似度。
代码里也删除了百度API相关配置。

PR 相关说明,直接在 PR 里评论哈

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
kind/feature Category issues or prs related to feature request.
Projects
None yet
Development

No branches or pull requests

5 participants