【高德地图API】从零开始学高德JS API(一)地图展现——仙剑地图,麻点图,街景,室内图

下面是基于KWIC 的关键字匹配算法(管道+过滤器模式下实现)

关键部分的管道+过滤器 软件体系下的实现, 在很多的关键字搜索平台都使用了这一 循环移位+排序输出的 关键字匹配算法:

具体需求如下:

1、使用管道-过滤器风格:

每个过滤器处理数据,然后将结果送至下一个过滤器,。要有数据传入,过滤器即开始工作。过滤器之间的数据共享被严格限制在管道传输

四个过滤器:

输入(Input filter):

从数据源读取输入文件,解析格式,将行写入输出管道

移位(CircularShifter filter):循环移位

排序(Alphabetizer filter):

输出(Output filter)

管道:

in_cs pipe

cs_al pipe

al_ou pile

例如:

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace KWIC
{
    /// <summary>
    /// 管道类
    /// </summary>
    public class Pipe
    {
      List<string> word;
      public List<string> read()
        {
            return word;
        }
      public void write(List<string> word)
        { this.word = word; }
    }

    /// <summary>
    /// 管道之间的过滤器接口
    /// </summary>
    public abstract class Filter
    {

        public virtual void Transform()
        { }
    }

    /// <summary>
    /// 继承并实现实现管道接口
    /// </summary>
    public class InputFilter : Filter
    {

        public Pipe outPipe;
        public List<string> word;
        public InputFilter(List<string> word, Pipe outPipe)
        {
            this.word = word;
            this.outPipe = outPipe;
        }
        public void Transform()
        {
            outPipe.write(word);
        }
    }

    /// <summary>
    /// 继承并实现过滤器接口
    /// </summary>
    public class CircleShiftFilter : Filter
    {
        public Pipe inputPipe;
        public Pipe outPipe;
        public CircleShiftFilter(Pipe inputPipe, Pipe outPipe)
        {
            this.inputPipe = inputPipe;
            this.outPipe = outPipe;
        }
        /// <summary>
        /// 关键的循环移位函数
        /// </summary>
        public virtual void Transform()
        {
            List<string> word = inputPipe.read();

            /////////////////////////////////////////////// 补充代码,将WORD数组中字符串循环移位////////////////////////////////////////////////////////

            List<string> turned_words = new List<string>();

            // 获得每一行字符串数据
            foreach (string line in word)
            {
                // 拆分一句话
                string[] words = line.Split(' ');

                // 获取单词数
                ulong word_number = (ulong)words.LongLength;

                // 临时存储中间排序好的串
                List<string> tmp_words = new List<string>();

                tmp_words.Clear();

                tmp_words.Add(line);

                string tmp_line = "";

                for (ulong i = 0; i < word_number - 1; i++)
                {
                    // 获取上一行串
                    tmp_line = tmp_words[tmp_words.Count - 1];

                    // 获取上一行串的最后一个单词
                    string last_word = tmp_line.Split(' ')[word_number -1];

                    // 获取上一行串的除了最后一个单词之外的所有单词
                    string left_words = tmp_line.Substring(0, (tmp_line.Length -last_word.Length-1 ));

                    tmp_words.Add(last_word +" "+ left_words );
                }

                // 移除原有的串
                tmp_words.RemoveAt(0);

                // 将一句移位的串加到临时的list集合
                turned_words.AddRange(tmp_words);

            }

            // 将所有移位的串加到原来list集合
            word.AddRange(turned_words);

            /////////////////////////////////////
            outPipe.write(word); 

        }
    }

    /// <summary>
    /// 实现的排序过滤器类
    /// </summary>
    public class AlphaFilter : Filter
    {
        public Pipe inputPipe;
        public Pipe outPipe;
        public AlphaFilter(Pipe inputPipe, Pipe outPipe)
        {
            this.inputPipe = inputPipe;
            this.outPipe = outPipe;
        }

        /// <summary>
        /// 排序输出函数
        /// </summary>
        public void Transform()
        {
            List<string> word = inputPipe.read();

            ////////////////////////////////////// 补充代码,将word数组中单词排序输出/////////////////////////////////////////////////
            word.Sort();

            outPipe.write(word); 

        }
    }

    /// <summary>
    /// 实现输出过滤器接口类
    /// </summary>
    public class OutputFilter : Filter
    {
        public Pipe inputPipe;
        public Pipe outPipe;
        public OutputFilter(Pipe inputPipe, Pipe outPipe)
        {
            this.inputPipe = inputPipe; this.outPipe = outPipe;

        }
        public  void Transform()
        {
            List<string> word = inputPipe.read();
            outPipe.write(word);
        }
    }

    /// <summary>
    /// 程序的整体运行框架
    /// </summary>
    public class KWIC_System
    {

        Pipe in_cs; // create three objects of Pipe
        Pipe cs_al; // and one object of type
        Pipe al_ou; // FileInputStream
        Pipe ou_ui; // FileInputStream
        InputFilter inputFilter;
        CircleShiftFilter shifter;
        AlphaFilter alpha;
        OutputFilter output; // output to screen
      public   KWIC_System()
        {
            in_cs = new Pipe(); // create three objects of Pipe
            cs_al = new Pipe(); // and one object of type
            al_ou = new Pipe(); // FileInputStream
            ou_ui = new Pipe(); // FileInputStream

            List<string> word = new List<string>();
	    word.Add(Regex.Replace("I love you".Trim(), @"\s+", " ")); //正则会获取到所有类型的空格(比如制表符,新行等等),然后将其替换为一个空格
            word.Add(Regex.Replace("me too".Trim(), @"\s+", " "));
            word.Add(Regex.Replace("do you know".Trim(), @"\s+", " "));  

            inputFilter = new InputFilter(word, in_cs);
            shifter = new CircleShiftFilter(in_cs, cs_al);
            alpha = new AlphaFilter(cs_al, al_ou);
            output = new OutputFilter(al_ou,ou_ui); // output to screen
        }
        public List<string > GetResult()
        {
            inputFilter.Transform();
            shifter.Transform();
            alpha.Transform();
            output.Transform();

            return ou_ui.read();
        }

    }

}

(备注:如果想换行这里想换行输出,需要在结尾输出的每一行结尾加‘\r\n’)

在广泛的搜索技术中,其实这个关键字匹配算法应用范围很广,比如我们常见的Baidu和Google的搜索关键字 提示功能。



【高德地图API】从零开始学高德JS API(一)地图展现——仙剑地图,麻点图,街景,室内图

时间: 2024-11-05 19:43:03

【高德地图API】从零开始学高德JS API(一)地图展现——仙剑地图,麻点图,街景,室内图的相关文章

【高德地图API】从零开始学高德JS API(七)——定位方式大揭秘

摘要:关于定位,分为GPS定位和网络定位2种.GPS定位,精度较高,可达到10米,但室内不可用,且超级费电.网络定位,分为wifi定位和基站定位,都是通过获取wifi或者基站信息,然后查询对应的wifi或者基站位置数据库,得到的定位地点.定位数据库可以不断完善不断补充,所以,越定位越准确.本文详细描述了,如果使用高德JS API来实现位置定位.城市定位的方法,包含了IP定位,浏览器定位,检索定位等多种网络定位方法.当然,如果您的手机有GPS功能,那么使用浏览器定位的时候,会自动获取GPS信息,使

【高德地图API】从零开始学高德JS API(四)搜索服务

摘要:地图服务,大家能想到哪些?POI搜素,输入提示,地址解析,公交导航,驾车导航,步行导航,道路查询(交叉口),行政区划等等.如果说覆盖物Marker是地图的骨骼,那么服务,就是地图的气血.有个各种各样的地图服务,我们的地图应用才能变得有血有肉,活灵活现.第四篇拆成了几个要点,本篇主要讲搜索服务.包括周边搜索,关键词搜索,范围搜索,搜索提示(自动完成,输入提示),行政区域,交叉路口,检索自有数据(云图). demo:http://zhaoziang.com/amap/zero_4_1.html

【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装的一系列更加便于开发者使用,减少开发者工作量的二级API接口.除了官方通用的鱼骨.鹰眼控件,还有大量官方开发的地图插件,类似谷歌的lib.当然本文还会介绍自定义插件的使用. ------------------------------------------------------------------------------------------------- 第一部分 控件 目前官方支持的控件包含:缩放控制条-地图

【高德地图API】从零开始学高德JS API(五)路线规划——驾车|公交|步行

先来看两个问题:路线规划与导航有什么区别?步行导航与驾车导航有什么区别? 回答: 1.路线规划,指的是为用户提供3条路线推荐.[高德]在提供路线规划的时候,会提供用户自定义路线规划功能,这是别家没有做到的.导航,指的是为驾车用户提示路口信息,向左向右,进入匝道等信息. 2.我们这里说的步行导航和驾车导航,严格的说,应该是路线规划.从A地到B地,如果是驾车,路线规划会将公路路网做为搜索数据:如果是步行,过街天桥.地下通道.人行道做为搜索数据. ---------------------------

【高德地图API】从零开始学高德JS API(四)搜索服务——POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索

摘要: 地图服务,大家能想到哪些?POI搜素,输入提示,地址解析,公交导航,驾车导航,步行导航,道路查询(交叉口),行政区划等等.如果说覆盖物Marker是地图的骨骼,那么服务,就是地图的气血.有个各种各样的地图服务,我们的地图应用才能变得有血有肉,活灵活现. 第四篇拆成了几个要点,本篇主要讲搜索服务.包括周边搜索,关键词搜索,范围搜索,搜索提示(自动完成,输入提示),行政区域,交叉路口,检索自有数据(云图). demo:http://zhaoziang.com/amap/zero_4_1.ht

【高德地图API】从零开始学高德JS API(一)地图展现

摘要:关于地图的显示,我想大家最关心的就是麻点图,自定义底图的解决方案了吧.在过去,marker大于500之后,浏览器开始逐渐卡死,大家都开始寻找解决方案,比如聚合marker啊,比如麻点图啊.聚合marker里面还有一些复杂的算法,而麻点图,最让大家头疼的,就是如何生成麻点图,如何切图,如何把图片贴到地图上,还有如何定位图片的位置吧.以前那么复杂的一系列操作,居然让云图的可视化操作一下子解决了.现在只要点一点鼠标,麻点图就自动生成了.真是广大LBS开发者的福音. 以前写过从零开始学百度地图AP

【高德地图API】从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物

覆盖物,是一张地图的灵魂.有覆盖物的地图,才是完整的地图.在一张地图上,除了底层的底图(瓦片图,矢量图),控件(有功能可操作的工具),最重要最不可缺少的就是覆盖物了.覆盖物有多种,包括,标注.折线.多边形.信息窗口.聚合marker.麻点图和图片覆盖物.本文会详细介绍每一种覆盖物的概念,添加方法,修改方法,移除方法等.最后会提供示例和源代码下载. 示例demo:http://zhaoziang.com/amap/zero_3_1.html ----------------------------

【高德地图API】从零开始学高德JS API(三)覆盖物

摘要:覆盖物,是一张地图的灵魂.有覆盖物的地图,才是完整的地图.在一张地图上,除了底层的底图(瓦片图,矢量图),控件(有功能可操作的工具),最重要最不可缺少的就是覆盖物了.覆盖物有多种,包括,标注.折线.多边形.信息窗口.聚合marker.麻点图和图片覆盖物.本文会详细介绍每一种覆盖物的概念,添加方法,修改方法,移除方法等.最后会提供示例和源代码下载. 示例demo:http://zhaoziang.com/amap/zero_3_1.html -------------------------

【高德地图API】从零开始学高德JS API(六)——坐标转换

原文:[高德地图API]从零开始学高德JS API(六)--坐标转换 摘要:如何从GPS转到谷歌?如何从百度转到高德?这些都是小case.我们还提供,如何将基站cell_id转换为GPS坐标? ----------------------------------------------------------------------------------------- 第一部分 各种坐标系详解 1.大地坐标系统 WGS-84 用来表述地球上点的位置的一种地区坐标系统.它采用一个十分近似于地球自