如何创建位置层次结构

问题描述 投票:0回答:1

假设有一个表,其中混合了国家、城市、子城市等数据。示例:

Name | id | parent_id
1) united kingdom | 1 | 0;
2) london | 2 | 1;
3) south london | 3 | 2;

我从表中获取数据,需要为每个城市创建一个 URL,例如伦敦南部:

/united-kingdom/london/south-london

如何从此类传入数据创建这样的层次结构?

var geoSolution = await _geoService.GetGeoChildren(selectedCountry, culture, cancellationToken);   
foreach (var geo in geoSolution.Value ?? Enumerable.Empty<Geo>())
{
    if (geo.ParentId == null) continue; 
    sitemapList.Add(new SitemapHtml(geo.GeoName ?? string.Empty, GetPrefix(geo.Name ?? string.Empty, product ?? ""))
    {
        Links = await GetSitemapLinksForGeo(urlSections, geo, cancellationToken, true)
    });
}

return sitemapList.OrderBy(x => x.Name).ToList();

geoSolution 返回这些对象的列表,每个对象都有 id 和parentId,如果其国家=>parentId == null

c#
1个回答
0
投票

您绑定到不稳定的数据类型。 伦敦是一个地名(Toponym),可以任意改变,伦敦作为地名可以有翻译,等等。

如果您有地理位置,这些是坐标或一些编码坐标系。 在这些系统中已经存在(以某种方式编码的)伦敦。

编码系统的要求

  • 覆盖整个地球
  • 无碰撞
  • ..等等

主要的编码系统是建立在象限上的——这是一种只用(!)一个数字来表示(编码)地球的编码系统,并且通常这个数字不会超过ulong类型。

A 象限是 4 个正方形,编码为 00、01、10、11,但是这 4 个相对于自身的正方形中的每一个都可以由更小的 4 个正方形(即 16 个正方形)编码为

00 = (0000, 0001, 0010, 0011)
01 = (0100, 0101, 0110, 0111)
10 = (1000, 1001, 1010, 1011)
11 = (1100, 1101, 1110, 1111)

..等等 - 它产生一个由一个数字编码的二维空间。

这个二维空间是一个球体,但是它被拉伸成一个圆柱体,圆柱体被扩展成一个有限的平面——这就是地球的地图,而这张地球的地图是被编码的(例如)按象限。

但是英格兰在这个系统中是用一个数字编码的,并且这个数字与象限编码中的数字相同,例如010111 - 而且这个数字是唯一的并且很小。

但是

英格兰中包含的所有内容都是这个数字的派生,即英格兰中的所有内容都以数字010111开头,例如苏塞克斯郡在地理上位于某个地方,但它属于英格兰,它比英格兰小,例如,这是数字 (010111)110011,其中括号内是英格兰,不在括号内是苏塞克斯。

(010111)       England
(010111)110011 Sussex

但是你可以安排象限的算术,实际上非常快速地确定一个对象对另一个对象的归属,排序,搜索等等。

您正在与地理系统通信,但这些系统已经有了实现,并且这些系统已经实现了您需要的层次结构

https://en.wikipedia.org/wiki/Toponymy https://en.wikipedia.org/wiki/Quadtree

© www.soinside.com 2019 - 2024. All rights reserved.