土地法違反者の捜索プロセスの最適化

こんにちは、Habr! 私は数年前から読んでいるこの素晴らしいプロジェクトに貢献することを長い間夢見てきました。



しかし、私は教育的なプログラマーではないため、私のプロジェクトはここで紹介したプロジェクトほどエレガントではありませんでした。 したがって、私は非常に長い間、ここに何を置くことができ、マイナスを投げないのかを考えました。 その結果、仕事の枠組みの中で、従業員の仕事を最適化するアイデアが現れました。これにより、(私の意見では)人生が大幅に簡素化されます。



アイデアの本質は、個人の住宅ビルのみを建設できる土地区画があることであり(個人住宅建設)、商業活動にこれらの施設を使用することは禁じられています。 ロシアではこれは誰も止めませんでしたが、従業員が歩き回り、家が住宅として建てられ、屋台として使用されていることを確認する必要があることがわかりました。 その結果、あなたは長い間歩く必要があり、たくさんのことに加えて、それがどんな家であるかを明確にするために常に情報にアクセスする必要があります。 まあ、またはオフィスで、確認する住所を選択してから、ラクダを利用し、水を補給して、すばらしい旅に出ましょう。



私たちのメディアでは、彼らはデジタル経済はおそらく庭にあり、一般的にはモノのインターネットにあると言っています。 データベース内の外観という形でのそのアプローチは、どういうわけか奇妙に見えます。



その結果、 公共の地籍図に基づいてヒートマップを作成し、サイト上のデータを分析するというアイデアを実現し、地区内のすべての地籍地区で最初のデータが取得されました。 抽出方法はあまり人道的ではありませんでした。 マップにロードされたタイルを解析する際に、すべてのSVGファイルが保存され、ブロックの名前がジオメトリ記述タグからエクスポートされました。



その後、四半期ごとに、その境界内のすべてのオブジェクトが受信されました。 問題はデータ分析の段階で現れました。オブジェクトの座標はメルカトルP3857形式で与えられるため、経度と緯度を使用して通常の座標系に変換を追加する必要がありました。 オブジェクトの座標は2つの形式で与えられます。これは、サイトの正確な中心と、サイトの一般的なジオメトリの極値です。



JSONデータ
"center": { "x": 5135333.187724394, "y": 6709637.473119974 }, "extent": { "xmax": 5135346.924914406, "xmin": 5135320.375756669, "ymax": 6709666.568613776, "ymin": 6709611.5618947 }
      
      







ヒートマップの変換後の最初の座標を使用しました。 QGIS(初めて見た)のマップをいじりながら、人気のあるYandexマップと2Gisサービスでは、座標でオブジェクトを検索できるというおかしなアイデアが生まれました。 すぐにこの理論をテストすることにしました。 確かに、座標で運転する場合、両方のサービスはこの家に関する情報を提供します。 したがって、結論はそれ自身を示唆しています:住宅建設のみの特性を持つオブジェクトを選択し、組織のデータを介してそれらをチェックし、カードが組織のリストを返した場合、この構造は意図された目的には使用されません。



最初のチェックはプロットの中心に関するデータで実行されましたが、実践が示すように、プロットはその上の家よりも大きく、家は常にプロットの中央にあるとは限らないため、データは必ずしも収束しませんでした。 しかし、理論を確認するために、それは働きました。 私はこのサイトをチェックしました。民間セクターがあり、小さなお店やサービスがあることは確かです。



ダムPythonスクリプトを使用して、マップからデータを取得しました(すぐに謝罪しますか?このコードでプログラマーを怒らせた場合)。



コード
 import requests import json import time import csv import pyproj from random import choice from random import randint from pandas import read_csv def get_proxy(): headers = {'User-Agent':'Mozilla/5.0 (Windows NT 8; WOW32; rv:54.0) Gecko/20100101 Firefox/54.0'} proxies = open('proxy.txt').read().split('\n') result=None proxy="" while result is None: try: proxy = {'http':'http://'+choice(proxies)} r = requests.get('http://ya.ru',headers=headers, proxies=proxy,timeout=(60, 60)) if r.status_code==200: result=proxy except: pass return proxy def main(): headers = { 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept-Encoding':'gzip, deflate', 'Accept-Language':'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4', 'Cache-Control':'max-age=0', 'Connection':'keep-alive', 'Cookie':'_ym_uid=1495451406361935235; _ym_isad=1; topCities=43-2; _2gis_webapi_session=0faa6497-0004-47c5-86d8-3bf9677f972a; _2gis_webapi_user=7e256d33-4c6e-44ab-a219-efc71e2d330f', 'DNT':'1', 'Host':'catalog.api.2gis.ru', 'Upgrade-Insecure-Requests':'1', 'User-Agent':'Mozilla/5.0 (Windows NT 7; WOW32; rv:54.0) Gecko/20100101 Firefox/54.0', 'X-Compress':'null' } print("start") csvfile = open('GetShopsByCoordinats.csv', 'a', newline='') fieldnames = ['id', 'x','y','shops','names'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames, delimiter=';', quotechar='|',) writer.writeheader() inputCSV = read_csv('for2GIS.csv', sep=';', skiprows=[0], header=None) for i in range (0,5): s= 'point='+str(inputCSV[1][i])+'%2C'+str(inputCSV[2][i])+'&fields=search_attributes%2Citems.links&key=rutnpt3272' print (s) with requests.Session() as session: r=session.get('https://catalog.api.2gis.ru/2.0/geo/search?'+s, headers=headers,timeout=(60, 60)) JsonData = r.json() try: print(JsonData['result']['items'][0]['links']['branches']['count']) writer.writerow({'id': str(inputCSV[0][i]),'x': str(inputCSV[1][i]), 'y': str(inputCSV[2][i]), 'shops': JsonData['result']['items'][0]['links']['branches']['count'] }) except: writer.writerow({'id': str(inputCSV[0][i]),'x': str(inputCSV[1][i]), 'y': str(inputCSV[2][i]), 'shops': 'none' }) time.sleep(randint(1,3)) csvfile.close() print ('fin') if __name__=='__main__': main()
      
      







その結果、チェック対象のすべてのオブジェクトを反映したファイルが得られ、サイトの中心の地籍番号と座標、およびこの時点での店舗数に関するサイトのデータが反映されています。 名前と連絡先の詳細自体は必要ありませんでした。



店舗数が0を超える列でのExcelのBanalオートフィルター、および潜在的な違反者のリストを取得します。必要なのは、既に「検証済み」アドレスに移動するだけです。

将来の計画は、ポイントで検索するのではなく、サイトの境界の半径内で検索します。そのような機会はAPIにあります。 また、識別されたオブジェクトの数が十分であれば、利用可能なデータに応じて最適なルートと検証行為のパターンを作成することもできます。



その結果、従業員は歩き回るだけでなく、必要なオブジェクトのみをチェックできる非常にシンプルなシステムになりました。 識別されたオブジェクトを確認した後、アルゴリズムを調整する必要がある場合、マップ上の必要な検証領域を強調表示するだけで、検証用のリストを自動的に作成できます。



データのアップロードについては、ダウンロードのために、合法的なAPIキーを受け取りました。



All Articles