高德poi获取之矩形搜索法(冲出900条限制)

本文介绍了如何利用高德地图API的多边形搜索法获取POI数据,详细讲解了基本思想和实现过程,包括一次举手、多次举手和矩形区域切分函数的构建。还探讨了两种区域切分方法的优缺点,并给出了四叉树方法的代码实现,最后展示了完整代码和功能更新。

前言

据说高德POI的尽头是多边形搜索法,今天下午也是简单试了一下。

高德poi的获取有四种基本方法,其中关键词搜索法已经在博客Python获取高德POI(关键词搜索法),许多基本的知识也在上文中详细赘述了,如果是没有基础的朋友建议先看完关键词搜索法,这有助于您看懂这篇文章。


查看API接口

高德地图的开放平台提供了四种poi获取的接口:

  1. 关键字搜索: 通过用POI的关键字进行条件搜索,例如:肯德基、朝阳公园等;同时支持设置POI类型搜索,例如:银行
  2. 周边搜索: 在用户传入经纬度坐标点附近,在设定的范围内,按照关键字或POI类型搜索;
  3. 多边形搜索: 在多边形区域内进行搜索
  4. ID查询: 通过POI ID,查询某个POI详情,建议可同输入提示API配合使用

那么我们这次要使用的是多边形搜索法,而且用的是矩形来获取poi。通过查看多边形搜索法的使用说明,我们可以知道,如果要使用这个多边形搜索法,我们必须提注意以下几个地方:

1. 提供多边形的坐标对。形如:112.953161,23.935966为一个坐标对,由经纬度构成
2. 坐标对之间用“|”进行分割,坐标对按照经度在前、纬度在后的方式提供,且经纬度之间用逗号隔开。
3. 当区域为矩形的时候,只需要提供左上右下两个顶点坐标。

在这里插入图片描述


基本思想

那么了解完这个API的使用,我们就可以开始动手构思如何对区域进行切分。
在搜索完网上的一些多边形搜索法之后,不外乎以下两种:

  1. 通过用户提供的长度将多边形进行格网化,然后遍历每个格子内的poi。
  2. 通过四叉树的方法将区域不断切分成四个子矩形,当矩形内poi数量小于900的时候直接获取poi;当矩形内poi数量大于900的时候对该矩形继续切分,直至每个子矩形内的poi数量都小于900.

优缺点:
第一种格网化的方法是相对简单,只需要将区域的长和宽进行n等分,通过遍历来实现获取poi,但缺点也很明显,长度的大小由用户自己定义,当长度太小的时候,需要遍历的格网数量几何级增加,长度太大的时候不难保证poi的完整性。
第二种方法是运用递归的方法,矩形切分的大小由区域内poi的数量来控制,既能保证poi的完整,又免去设置区域大小的麻烦。缺点在于由于是矩形搜索,因此获取的poi难免会有超过目标区域的地方,需要后期用GIS的手段进行裁剪

实现过程

引入我们需要的库

#库的说明
1.requests --爬虫常用库
2.json  --该库能够帮我们处理高德返回的JSON格式的数据
3.Coordin_transformlat -- 这个是自己写的一个坐标转换的库,其目的是为了解决开头说的坐标偏移的问题
4.csv --这个是将poi点最终保存为csv文件所使用的库

#引入所需的库
import requests
import json
import csv
from Coordin_transformlat import gcj02towgs84

构建一次举手函数

通过刚刚查看的多边形的API可以知道,如果我们要请求数据,那么需要填写的关键参数有以下几个:

key:高德地图的密钥
polygon:经纬度坐标对
keywords或types:关键词或者poi分类
page:表示当前页数,用于控制举手的次数

所以我们一共有四个参数需要设置。
Tips: 我们还是可以运用关键词搜索法里的思想,将这个过程理解成举手向老师索取数据,举一次手老师给你20条数据,跟关键词搜索法不同的地方在于,这个举手函数里用的API是多边形搜索法。

def Get_poi_polygon(key,polygon,keywords,page):
    '''
    这是一个能够从高德地图获取poi数据的函数
    key:为用户申请的高德密钥
    polygon:目标区域的坐标对,默认是list格式,按照[左上经度,左上纬度,右下经度,右下纬度]的顺序输入
    keywords:POI数据的类型
    page:当前页数
    '''
    #设置header
    header = {
   
   'User-Agent': "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"}

    #将输进来的矩形进行格式化
    Polygonstr = str(polygon[0]) + ',' + str(polygon[1]) + '|' + str(polygon[2]) + ',' + str(polygon[3])

    #构建url
    url = 'https://restapi.amap.com/v3/place/polygon?polygon={}&key={}&keywords={}&page={}'.format(Polygonstr, key, keywords, page)
    

    #用get函数请求数据
    r = requests.get(url, headers=header)

    #设置数据的编码为'utf-8'
    r.encoding = 'utf-8'

    # 将请求得到的数据按照'utf-8'编码成字符串
    data = r.text
    return data

在上面的代码里,唯一需要注意的地方是需要对用户输入进来的坐标对进行格式化,因为用户输入的坐标对通常是浮点型的,但这个坐标对我们需要拼接到url里,因此我们需要将其转换成字符型,因此在url之前需要进行这个格式化。


构建多次举手函数

上面的函数是一次举手的函数,那么下面我们需要通过次数来实现爬取一个区域内的所有poi。
刚刚上文说到可以通过page来控制举手的次数,那么利用高德地图每次返回的页数最多包含20条记录的特点,通过判断当前页数page下的count是否为0来实现控制次数。

这里面代码的书写与上一篇大有不同,原因在于以下地方:
需要通过传入的矩形,来判断当前区域内poi的数量是否大于800,如果大于800,需要返回一个值,方便我们继续对区域进行切分。如果小于800,我们就直接将数据写入csv中,因此我也是在这个函数里直接调用了写入数据的函数。

def Get_times_polygon(key,polygon,keywords):
    '''
    这是一个控制Get_poi_polygon申请次数的函数
    '''
    page = 1
    # 执行以下代码,直到count为0的时候跳出循环
    while True:
        # 调用第一个函数来获取数据
        result = Get_poi_polygon(key,polygon, keywords, page)
        # json.loads可以对获取回来JSON格式的数据进行解码
        content = json
基于 NSFW Model 色情图片识别鉴黄 后面更新视频检测 项目背景: 随着互联网的快速发展,网络上的信息量呈现出爆炸式的增长。然而,互联网上的内容良莠不齐,其中不乏一些不良信息,如色情、暴力等。这些信息对青少年的健康成长和社会风气产生了不良影响。为了净化网络环境,保护青少年免受不良信息的侵害,我国政府加大了对网络内容的监管力度。在此背景下,本项目应运而生,旨在实现对网络图片和视频的自动识别与过滤,助力构建清朗的网络空间。 项目简介: 本项目基于 NSFW(Not Safe For Work)Model,利用深度学习技术对色情图片进行识别与鉴黄。NSFW Model 是一种基于卷积神经网络(CNN)的图像识别模型,通过学习大量的色情图片和非色情图片,能够准确地判断一张图片是否含有色情内容。本项目在 NSFW Model 的基础上,进一步优化了模型结构,提高了识别的准确率和效率。 项目功能: 色情图片识别:用户上传图片后,系统会自动调用 NSFW Model 对图片进行识别,判断图片是否含有色情内容。如果含有色情内容,系统会给出相应的提示,并阻止图片的传播。 视频检测:针对网络视频,本项目采用帧提取技术,将视频分解为一帧帧图片,然后使用 NSFW Model 对这些图片进行识别。如果检测到含有色情内容的图片,系统会给出相应的提示,并阻止视频的传播。 实时监控:本项目可应用于网络直播、短视频平台等场景,实时监控画面内容,一旦检测到含有色情内容的画面,立即进行屏蔽处理,确保网络环境的纯洁。
### 如何在本地部署 NSFW 模型或服务 要在本地环境中成功部署 NSFW(不适宜工作场合内容)检测模型或服务,以下是详细的说明: #### 准备环境 为了确保能够顺利运行模型和服务,需要安装必要的依赖项。这些工具和库包括但不限于以下几类: - **Python 环境**: 推荐使用 Python 3.7 或更高版本。 - **Transformers 库**: 提供加载预训练模型的功能[^1]。 - **PyTorch/TensorFlow**: 支持深度学习框架的计算需求。 - **Pillow (PIL)**: 处理图像文件并将其转换为适合输入模型的形式。 具体命令如下所示: ```bash pip install transformers torch Pillow ``` #### 加载模型与测试 通过 Hugging Face 的 `transformers` 工具包可以直接访问已有的 NSFW 图片分类模型。例如,可以采用名为 `"Falconsai/nsfw_image_detection"` 的公开模型来完成此任务[^1]。 下面是一个简单的代码片段展示如何加载该模型并对单张图片执行预测操作: ```python from PIL import Image from transformers import pipeline def classify_nsfw(image_path): # 打开指定路径下的图片文件 img = Image.open(image_path) # 初始化 image-classification 流水线对象,并指明使用的特定模型名称 classifier = pipeline("image-classification", model="Falconsai/nsfw_image_detection") # 对传入的图片调用流水线方法得到其类别标签及其置信度分数列表形式的结果 result = classifier(img) return result if __name__ == "__main__": test_img_path = "<your_test_image>" output_results = classify_nsfw(test_img_path) print(output_results) ``` 注意替换 `<your_test_image>` 成实际存在的图片绝对或者相对地址字符串值之前再尝试运行以上脚本。 #### 构建 RESTful API 服务 如果希望进一步扩展功能至 Web 应用程序层面,则可考虑利用 Flask/Django 这样的轻量级 web 开发框架构建起支持 HTTP 请求交互的服务端接口。这里给出基于 FastAPI 实现的一个简单例子作为示范用途: ```python import uvicorn from fastapi import FastAPI, File, UploadFile from PIL import Image from io import BytesIO from typing import List from pydantic import BaseModel app = FastAPI() class Prediction(BaseModel): label: str score: float @app.post("/predict/", response_model=List[Prediction]) async def predict(file: UploadFile = File(...)): try: contents = await file.read() pil_image = Image.open(BytesIO(contents)) clf_pipeline = pipeline('image-classification', model='Falconsai/nsfw_image_detection') predictions = clf_pipeline(pil_image) formatted_preds = [{"label": pred['label'], "score": round(pred['score'], 4)} for pred in predictions] return formatted_preds except Exception as e: raise ValueError(f"Error processing uploaded file {e}") if __name__ == '__main__': uvicorn.run(app, host='0.0.0.0', port=8000) ``` 启动服务器之后即可向 `/predict/` 路径发送 POST 请求附带上传待分析的目标图片获取返回结果了。 ---
评论 109
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值