首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >node.js中的地理编码工具

node.js中的地理编码工具
EN

Stack Overflow用户
提问于 2013-09-09 15:07:10
回答 3查看 4.3K关注 0票数 3

我正在寻找用于处理地理空间数据的node.js库.我在数据库中有大量的地理标记数据。

所需的功能包括:

  1. GeoCoding与逆向地理编码
  2. 找到附近的物品
  3. 查找地质范围内的项目

就像一个与RoR中的gem等价的节点。

EN

回答 3

Stack Overflow用户

发布于 2016-08-29 15:50:41

在我自己尝试回答这个问题之后,我会更新这个问题。

上面推荐的地编码器库上一次更新是在2014年,似乎并没有涉及到承诺。节点地编码器正在被积极维护,它基于承诺的api允许您在使用Babel/ES7时做类似的事情:

代码语言:javascript
运行
复制
const NodeGeocoder = require('node-geocoder');
let geocoder = NodeGeocoder()
let assert = require('assert');

describe('geocoder#geocode()', () => {

    it('geocodes things', async () => {
      let result = await geocoder.geocode("Ottawa, Canada")
      assert.equal(45.4215296, result[0].latitude)
    })

})

我确实发现,节点地理编码器给出了它从Google/whomever获得的结果的一个子集,而Ruby的地理编码项目似乎给出了整个响应。

代码语言:javascript
运行
复制
//result returned from geocoder.geocode:
[ { formattedAddress: 'Ottawa, ON, Canada',
    latitude: 45.4215296,
    longitude: -75.69719309999999,
    extra: 
     { googlePlaceId: 'ChIJrxNRX7IFzkwR7RXdMeFRaoo',
       confidence: 0.5,
       premise: null,
       subpremise: null,
       neighborhood: null,
       establishment: null },
    administrativeLevels: 
     { level2long: 'Ottawa Division',
       level2short: 'Ottawa Division',
       level1long: 'Ontario',
       level1short: 'ON' },
    city: 'Ottawa',
    country: 'Canada',
    countryCode: 'CA',
    provider: 'google' } ]

根据它的lat/lng来查找数据将是数据库处理的问题。我一直在使用ArangoDB,他们有一个函数WITHIN_RECTANGLE,它是对map.getBounds()宣传单/Mapbox-gl-js的完美补充。下面是一个示例:

代码语言:javascript
运行
复制
export async function locationsWithinBounds(swLat, swLng, neLat, neLng) {
  let query = aqlQuery`
    RETURN WITHIN_RECTANGLE(vertices, ${swLat}, ${swLng}, ${neLat}, ${neLng})
  `
  let results = await db.query(query)
  let allResults = await results.all()
  return allResults[0]
}

如果你探索他们的另一个geo函数,你会发现NEARIS_IN_POLYGON这样的东西。如果您需要在浏览器中使用geo函数,则应该查看Turf.js

票数 2
EN

Stack Overflow用户

发布于 2013-09-09 15:59:46

对于GeoCoding和反向部分,可以使用https://github.com/wyattdanger/geocoder

代码语言:javascript
运行
复制
npm install geocoder

对于find部分,最好的方法是使用数据库系统,如果它支持geo操作的话。

如果没有,可以将数据库复制到另一个数据库中(使用geo操作)?如果您需要处理千兆字节的数据,而不是very...easy来加载内存中的所有内容,数据库就会存在:)。

票数 0
EN

Stack Overflow用户

发布于 2019-09-09 18:16:02

根据您的应用程序是什么,如果您的索引对象不是直接Geocoding / rev-Geocoding,那么某种Geohashing可能会有所帮助。

地理哈希的一种类型是来自谷歌的S2,它可以用64位整数对地球表面的指尖进行精度较小的区域索引。

下面是一个示例,用于查找在检索时与节点S2库的边界上是否存在O(1)运行时的某个东西。在这种情况下,它检查是否有人在威廉斯堡,布鲁克林:

代码语言:javascript
运行
复制
const s2 = require('@radarlabs/s2');

const williamsburgLongLats = [
  [-73.95841598510742, 40.72423412682422],
  [-73.96957397460938, 40.71226430831242],
  [-73.9683723449707, 40.70497727808752],
  [-73.96184921264648, 40.69951148213175],
  [-73.95923137664795, 40.70852329864894],
  [-73.94775152206421, 40.70391994183744],
  [-73.94163608551025, 40.71145106322093],
  [-73.94335269927979, 40.71834706657437],
  [-73.9469575881958, 40.719778223045275],
  [-73.94970417022705, 40.722217623379684],
  [-73.95056247711182, 40.721892375167045],
  [-73.95193576812744, 40.72335597960796],
  [-73.95425319671631, 40.72312830991985],
];

const lls = williamsburgLongLats.map((lnglat) => {
  const [lng, lat] = lnglat;
  return new s2.LatLng(lat, lng);
});

const s2Level = 14; // ~0.32 km^2
const neighborhoodS2Cells =
  new Set(s2.RegionCoverer.getCoveringTokens(
    lls,
    { min: s2Level, max: s2Level }
  ));

const user1LongLat = [-73.95429611206055, 40.71369559554873]; // in williamsburg
const user2LongLat = [-73.9266586303711, 40.71616774648679];  // not in williamsburg

const user1S2 = new s2.CellId(new s2.LatLng(user1LongLat[1], user1LongLat[0])).parent(14); // level 14 to ensure 1:1 mapping to cover
const user2S2 = new s2.CellId(new s2.LatLng(user2LongLat[1], user2LongLat[0])).parent(14); // level 14 to ensure 1:1 mapping to cover

console.log(neighborhoodS2Cells.has(user1S2.token())); // true - O(1)
console.log(neighborhoodS2Cells.has(user2S2.token())); // false - O(1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18701378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档