GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

ArcGIS ProとArcMapの違いについて

最近はArcGISネタが多いですが、本日もArcGISです。ArcGIS ProとArcMapの違いについて書いてみようと思います。

ArcGIS Proとは

Esriが今一押しするArcGISのデスクトップアプリ。ArcMapの後継的な位置づけと思われる。

ArcMapとは

長年愛されているArcGISのデスクトップアプリ。ArcGIS Proがリリースされた今でも根強い人気を誇る。



両方ともデスクトップアプリです。でも一体何が違うのでしょうか?私も長くArcMapを使っていて、ようやく最近ArcGIS Proを使い始めました。まだまだ知らないことは多いですが、使ってみた感想やそれぞれの違いについて書いてみようと思います。

ArcGIS Proになって大きく変わったこと

  1. 64 ビット サポート
  2. Python3系
  3. 2D/3D ビジュアライゼーション
  4. マルチウインドウ

ArcMapでは32ビットでしたからこれは大きな違いですね。また、個人的にはPython3系が使えるようになったことが大きな進化かと思います。あと、3Dがもっとお手軽に使えるようになったことと、マルチウインドウの存在も大きな違いを作っているかと思います。マルチウインドウの良さは例えば2Dと3Dのマップを同時に別ウインドウで参照することができることとかでしょうか。

UI面での違い

ArcGIS Proを使う前はArcGISと同じノリで使えるかと思っていたのですが、ちょっと慣れるのに時間がかかりそうです。UIは完全に別物ですね。

まず、ArcMapの見た目はこんな感じです。
f:id:sanvarie:20190412233721p:plain

全体の見た目はこのようになっています。
f:id:sanvarie:20190412234308p:plain


ArcGIS Proはこのようにリボン形式になっていて今風ですね。
f:id:sanvarie:20190412233644p:plain

全体図はこんな感じでやっぱり洗練された感じですね。
f:id:sanvarie:20190412234209p:plain

機能面での違い

WEBマップとのデータ共有ができる

例えば、ArcGISOnlineとデータをArcGIS Pro上で読み込んだり、ArcGIS Pro で作成したデータをArcGISOnlineで参照したりすることができます。

これはWorld imageryというタイルレイヤをArcGIS Proで読み込んだものです。本当に便利ですね。
f:id:sanvarie:20190414145542p:plain

ArcGIS Pro SDKが使える

ArcGISでいうところのアドインです。アドインを使うと新しいボタンなどをArcMapに追加することができます。そのボタンに必要な機能を実装することで、各々の業務に合わせた機能をArcMapに搭載することができます。

ArcGIS Pro SDKも基本的には同じだと思うのですが、デフォルトのボタンを含めて活性非活性の制御が簡単にできたり、非同期処理を採用していたりします。まだ、少ししか触ったことがないのですが、こちらに関しても今後、詳しく紹介ができればと思っています(こういうアドインを作るには、みたいな感じで書いてみようと思います)。

タスクが使える

ワークフローや一連の操作をタスクとして設定することができます。モデルビルダーやPythonに近いものだと思いますが、モデルビルダーだとジオプロ以外は使えないのとPythonだとプログラミングの知識が必須になります。タスクはプログラミングの知識がなくてもモデルビルダー以上のことができる(マップ切り替えやUIボタンのコマンドなど)、非常に優れた機能です。

マップ移動がヌルサク

マップを動かす時の動きが非常に滑らかになっています。主観的なものだと思いますが、私はこちらの方が使っていて心地よいですね。



こんなところでしょうか。まだ使い込みが足りないので、知識が薄く、すべてをの違いを把握することができていないのですが、今後勉強していこうと思います。個人的にはArcMapを使っている方の中にはArcGIS Proに拒否感を示される方もいるかと思います(使い勝手が異なるので)。ただ、いつかはArcGIS Proに切り替えなければいけない日が来るかと思いますので、早めの切り替えをおすすめします。

ArcGIS Onlineを使ってみよう

さて、本日はArcGIS Onlineを使ってみようと思います。前から興味があったサービスなのですが、今までほとんどさわったことがありませんでした。これを機に色々勉強してみようと思います。

ArcGISOnlineとは

簡単に言うとクラウドGISです。様々なサービスがクラウド化されている昨今ですが、いよいよその波がGISにも来た感じですね。以下サイトに詳細が記載されています。ArcGIS Online | ESRIジャパン

ArcGISOnlineを使用するメリットとは?

やはり、デスクトップアプリをインストールする必要がなく、ブラウザ上で使用できるからではないでしょうか?アカウントさえ持っていればいつでもどこでもGISデータにアクセスすることができるというのは大きなメリットかと思います。

ArcGISOnlineのメリットがあまり生きないシチュエーションとは?

まだほとんど使ったことがないので推測ではありますが、作図・編集作業をがっつりやる場合はやはりデスクトップアプリを使ったほうがいいかと思います。あくまで参照・分析を中心とした作業をする際にArcGISOnlineの良さが生きるのではないでしょうか?この辺は使いながらメリットとデメリットをきちんと見極めてみようと思います。

ArcGISOnlineを使ってみよう

1.まずはArcGISOnlineのサイトに行きます。ArcGIS Online | ESRIジャパン
2.「ArcGISOnlineへログイン」を押してください。

f:id:sanvarie:20190407155703p:plain

3.ログインIDとパスワードを入力します。アカウントを作成していない方は「Create a public account.」のリンクを押してアカウントの作成をする必要があります。

f:id:sanvarie:20190407155904p:plain

4.ログインが完了すると、以下のようなページに遷移します。

f:id:sanvarie:20190407160326p:plain

5.主題図 アナグリフ(グレー)(地理院タイル)の画像をクリックすると以下のような地図が表示されます。

f:id:sanvarie:20190407160618p:plain


地図の表示まではすごく簡単ですね!

さて、どうやって使えばいいのか?と思っていたらなんと「逆引きガイド」が公開されていることがわかりました。とりあえず、これを使えば大まかな使用方法については把握できそうですね

https://www.esrij.com/cgi-bin/wp/wp-content/uploads/documents/ArcGISOnline_user_guide.pdf

今後試してみたいこと

  1. 色々なデータ(Shapeファイルとか)をArcGISOnlineで読み込み、編集してみる。
  2. ArcMapなどデスクトップアプリとのデータのやりとりを試してみる
  3. 表示範囲を限定する(例えば、東京都だけが表示されるようになるのかなど)。
  4. etc

まだ不明点はたくさんあるのですが、逆引きガイドを読むと大抵のことはできそうな気がします。

考察

新しくアカウントさえ作ればだれでもGISデータの共有ができ、ソフトウェアのインストールも不要なので、大きな組織で使う場合は本当に便利なサービスだと思います。ただ、編集作業をヘビーに行うような組織ではデスクトップアプリとの併用が必須のような気がします(デスクトップアプリで編集したデータをArcGISOnlineにアップみたいな流れになるのでしょうか)。とは言っても、時代の流れなどを考えると今後もますますArcGISOnlineの需要が高まるのではないでしょうか。

ArcGIS for Personal Useを使ってみよう!

さて、本日はArcGIS for Personal Useについて書いてみようと思います。

おそらくこのブログを読んでいただいている方の大半はArcGISのことはご存知かと思いますが、ご存知ではないという方は以下のエントリーに概要を記載していますので、興味がありましたら読んでみてください。
www.gis-py.com

ArcGISは商用のGISエンジンです。学校などには無償で提供されていますが、基本的には使用するにはお金がかかります。金額も個人で購入するには少しお高いかもしれません。しかし、なんとArcGIS for Personal Useを購入すると以下のソフトウェアが1 年間 18,000 円(税別)で利用することができます(非商用の個人利用に限定)。これはお買い得だと思います。

ArcGIS for Personal Use の購入方法

以下サイトで購入することができます。
ArcGIS for Personal Use | ESRIジャパン

ArcGIS for Personal Use に含まれるソフトウェア

ArcGIS Desktop Advanced (最新バージョン)
ArcGIS Pro
ArcGIS Online 1 指定ユーザー 100 サービス クレジット
ArcGIS 3D Analyst
ArcGIS Data Reviewer
ArcGIS Geostatistical Analyst
ArcGIS Image Analyst
ArcGIS Network Analyst
ArcGIS Publisher
ArcGIS Spatial Analyst
ArcGIS Tracking Analyst
ArcGIS Data Interoperability
ArcGIS Schematics
ArcGIS Workflow Manager

うーむ、豪華なラインナップですね。

休日もArcGISを使用しよう

ArcGISは多くの機能を搭載しており、ArcGISを毎日使用している私もその機能のほんの一部しか知りません。業務で使うソフトウェアは決まっていますし、使用する機能の範囲も決まっています。ですので、それを続けているだけでは自分の知識の幅を広げることができません。ArcGISは様々な業種で使われており、その使われ方も様々です。自分のスキルレベルを上げるには自分の使ったことがない機能を積極的に使う必要があるかと思います。自宅でArcGISを使うことができればそれも可能になるかと思います。

ArcGISの進化

ArcGISは日々進化しています。特に最近はArcGIS OnlineやArcGIS Proへのシフトがどんどん進んでいますし、その動きがますます加速するかと思います。しかし、業務上の都合などにより、こういった最新のソフトウェアへのキャッチアップができていない方もまだまだたくさんいらっしゃるかと思います。私も最近、ようやくArcGIS Proを使い始めました。Proと言っても基本的な考え方は今までと変わっていませんが、ArcMapとは劇的にUIが異なり、四苦八苦している最中です。その一方で「こういった考え方もあるのか」と思ったりすることで、自分の考え方の幅も広がっているような気がします。ITの世界は技術革新が早く、最新技術も数年で陳腐化してしまうことも珍しくありません。ArcGISの進化にあわせて自分も進化していかないといけないと感じています。


今日はプログラムの紹介とかは一切なく、ArcGISの宣伝のようになってしまいましたね。。もしかしたらしばらくはArcGIS関連のことを書くことが多くなるかもしれませんが、できるだけ偏らないように色々なことに挑戦してみようと思います。「こういったことを書いてほしい」、「こういったことはできないのか?」などありましたら、ぜひコメントを残していただければと思います。そちらにもチャレンジしてみようと思います。



ArcPyレシピ集⑥ ~重複した属性値を抽出~

さて、本日はArcPyについて書いてみようと思います。

以前、以下のエントリーで空間的に重複したフィーチャの抽出方法を紹介しました。

www.gis-py.com

今回は空間的ではなく、重複した属性、つまり、同カラムに同じ属性値を持つレコードの抽出方法を紹介します。

ArcPyとは

言わずもがなですが、ArcGISのデータを扱うためのPythonライブラリです。ArcPyに関しては当ブログで色々紹介していますので、興味のある方は以下エントリーを読んでみてください。

www.gis-py.com

www.gis-py.com

環境

Windows10 64bit
ArcGIS10.4.1 for Desktop
Python2.7.3

サンプルデータ

以下のようなデータを用意しました。testというカラムに重複した属性値をいくつか設定しています。
f:id:sanvarie:20190312105939p:plain

f:id:sanvarie:20190312110003p:plain

f:id:sanvarie:20190312112111p:plain

1,2,7,9が重複してますね!

サンプルコード

上記データの中にある重複した属性値を抽出するサンプルコードです。

# -*- coding: utf-8 -*-
import arcpy
from collections import Counter

arcpy.env.workspace = ur"C:\ArcPySample\Duplicate.gdb"

feature_class = "test"
column = "test"
c = []

for f in arcpy.da.SearchCursor(feature_class, column):
    c.append(f[0])

print [key for key,val in Counter(c).items() if val > 1]


結果を見ると、重複している属性値を抽出できたことが確認できました。ものすごい簡単ですね。
f:id:sanvarie:20190312112803p:plain

こんなのどういう時に使うの?と思われる方もいらっしゃるかもしれませんが、実際私は結構使います。例えば、キー項目として使っているカラムのデータに重複が発生してしまっている場合、こういうことをして対象データを抽出しています(そもそもキーカラムに重複を発生させるなよ、という話ですが)。ArcPyに興味がある方で「こんなことできないか?」という疑問がある方はぜひコメントを残してください。私にできることであればお答えできればと思います。本日は以上です。

Pythonで国土数値情報のWeb APIを使って全データを一括でダウンロードする方法

さて、今回も国土数値情報のWeb APIについて書いてみようと思います。先日、本件に関するエントリーを書きましたが、この時は一部データのダウンロードしかしませんでした。その時に全データを一括でダウンロードできたらいいなぁと思ったので、今回はそれについて書いてみようと思います。

国土数値情報のWeb APIとは?

以下エントリーで紹介しています。興味のある方はぜひ読んでみてください。

www.gis-py.com

ダウンロード対象

国土数値情報は以下の画像のように各カテゴリごとにデータをダウンロードできます。

f:id:sanvarie:20190215154354p:plain

そして、各カテゴリごとに年度、都道府県ごとにデータをダウンロードすることができます(カテゴリによっては一つの年度のみ、または、全国単位でのみダウンロード可能)。
f:id:sanvarie:20190215154622p:plain

今回は・・・

①大分類(例:1. 国土(水・土地))
②中分類(例:<水域>)
③小分類(例:海岸線)
④年度(最新の年度)

ごとにフォルダを作成してその中にダウンロードしたデータを格納していこうと思います(カテゴリによっては中分類がなかったりします)。

また、最初はすべての年度のデータをダウンロードしようと思ったのですが、どんでもないデータ量になりそうだったのであきらめました(笑)。サンプルコードには全ての年度のデータをとってくるコードを記載しますので(コメントアウトしています)、興味がある方はぜひ試してみてください。

環境

Python2.7.3
Windows10

サンプルコード

DATA_DESTINATIONに任意のディレクトリを指定してください。そこにデータをダウンロードします。

# -*- coding: utf-8 -*-
import zipfile
import os
import os.path
import requests
from lxml import etree

#任意の保存先
DATA_DESTINATION = ur"D:\gis-py\WebAPI"

#国土数値情報の概要情報取得
URL_OVERVIEW = "http://nlftp.mlit.go.jp/ksj/api/1.0b/index.php/app/getKSJSummary.xml" \
               "?appId=ksjapibeta1&lang=J&dataformat=1"

#国土数値情報取得のURL情報取得
url_detail = "http://nlftp.mlit.go.jp/ksj/api/1.0b/index.php/app/getKSJURL.xml" \
              "?appId=ksjapibeta1&lang=J&dataformat=1"

dic = {}

def get_url(url, identifier = 0):
    """
    国土数値情報のWEBAPIを使用して各情報をXMLで取得します。
    """
    if identifier == 0:
        resp = requests.get(url, timeout=10)
    else:
        url = url + "&identifier=%s" % (identifier)
        resp = requests.get(url, timeout=10)

    return etree.fromstring(resp.content)

def download_zip():
    """
    指定したURLからZIPをダウンロードします。
    """
    year = ""
    for key, value in dic.items():
        xml = get_url((url_detail), key)

        for x in xml.iter():

            if x.tag == "year":
                year = x.text

            if x.tag == "zipFileUrl":

                if year == value[0]:
                    year = ""

                    filename = x.text.split('/')[-1]
                    r = requests.get(x.text, stream=True)
                    with open(filename, 'wb') as f:
                        for chunk in r.iter_content(chunk_size=1024):
                            if chunk:
                                f.write(chunk)
                                f.flush()

                    uncompress_zip(filename, value[1])

def uncompress_zip(filename, destination):
    """
    ZIP ファイルを指定したディレクトリに展開します。
    """
    zfile = zipfile.ZipFile(filename)
    zfile.extractall(destination.encode("shift-jis"))

def make_directory(xml):
    """
    DATA_DESTINATIONの下に各フォルダを作成します。
    """
    element_list = []
    new_directry_list = []

    for x in xml.iter():

        if x.tag == "identifier":
            element_list.append(x.text)
        elif x.tag == "title":
            element_list.append(x.text)
        elif x.tag == "field1":
            element_list.append(x.text)
        elif x.tag == "field2":
            element_list.append(x.text)
        elif x.tag == "areaType":
            element_list.append(x.text)
            new_directry_list.append(element_list)
            element_list = []
            continue

    for n in new_directry_list:
        new_directry = ""
        year_list = []

        new_directry = os.path.join(DATA_DESTINATION, n[2])

        if n[3] != " " and n[3] != "-": #field2が不要なデータがあるため
            new_directry = os.path.join(new_directry, n[3])

        new_directry = os.path.join(new_directry, n[1])

        for x in get_url((url_detail), n[0]).iter("year"):
            year_list.append(x.text)

        year_list = list(set(year_list))
        max_year = max(year_list)

        new_dir = os.path.join(new_directry, max_year)

        if os.path.exists(new_dir) == 0: #なかったら作る
            os.makedirs(new_dir)
        dic[n[0]] = [max_year,new_dir]

        # ↓全ての年度のデータを取得したい場合は以下を使用する
        #year_list = list(set(year_list))
        #year_list.sort()
        #
        #for l in max(year_list):

        #    new_dir = os.path.join(new_directry, l)

        #    if os.path.exists(new_dir) == 0: #なかったら作る
        #        os.makedirs(new_dir)
        #    dic[n[0]] = [l,new_dir]

if __name__ == '__main__':
    make_directory(get_url(URL_OVERVIEW, 0))
    download_zip()

結果はこのようになりました。

f:id:sanvarie:20190215165917p:plain

f:id:sanvarie:20190215170009p:plain

f:id:sanvarie:20190215170120p:plain

ちゃんとダウンロードできている感じですね。データ量なのですが、なんと83GBになりました。全年度をダウンロードしたら一体どのくらいまでいくのでしょうか(汗)

本日は以上です。国土数値情報のデータを一括でダウンロードしたいという方はぜひ試してみてください。

Pythonで国土数値情報のWeb APIを使ってデータをダウンロードしてみよう

さて、今日は国土数値情報のWeb APIを使ってデータをダウンロードしてみようと思います。

国土数値情報とは?

以下エントリーでも紹介していますが、全国の河川、避難施設、鳥獣保護区、鉄道 など様々なデータをShape形式などで提供しているWEBサイトです。

www.gis-py.com

国土数値情報のAPIとは?

GISを日頃使っている方は国土数値情報に関してはすでにご存じかと思いますが、実は国土数値情報のWEB APIというものがあります。色々なデータをダウンロードする場合、何度もダウンロード作業をする必要があったり、アンケートに答える必要があったりで、正直面倒くさいなと思った方もいるのではないかと思います。そんな時の救世主がこのAPIです!

API仕様

http://nlftp.mlit.go.jp/ksj/api/specification_api_ksj.pdfに仕様の詳細が記載されていますので、興味のある方はぜひ読んでみてください。

ざっくり言うと以下二つの情報を取得することができます。
①国土数値情報の概要情報取得
②国土数値情報取得のURL情報取得

これだけだとよくわからないですね。。要するに・・・

①は国土数値情報では「海岸線」「ダム」などの情報を提供しているという概要的な情報を取得することができます。
f:id:sanvarie:20190212132519p:plain

②は「海岸線」などの各データの詳細情報を取得することができます。
f:id:sanvarie:20190212132559p:plain

各々の結果はXMLで取得でき、このようになります。

①国土数値情報の概要情報
f:id:sanvarie:20190212132938p:plain

②国土数値情報取得のURL情報
f:id:sanvarie:20190212133201p:plain

今回は「②国土数値情報取得のURL情報」を使用して、ファイルをダウンロードしようと思います。

環境

Python2.7.3
Windows10

サンプルコード

「国土数値情報 海岸線データ」をダウンロードするサンプルコードです。

# -*- coding: utf-8 -*-
import zipfile
import os.path
import requests
from lxml import etree

class WebAPI(object):

    def __init__(self):
        self.appId = "ksjapibeta1" #固定
        self.lang = "J"            #固定
        self.dataformat = 1        #固定
        self.identifier = "C23"    #各データ固有の番号
        self.prefCode = "1-47"     #都道府県
        self.fiscalyear = 2006     #年度
        self.dir = ur"D:\gis-py\WebAPI" #データ保存先

    def get_url(self):
        """
        国土数値情報のWEBAPIを使用して各情報をXMLで取得します。
        """

        url = "http://nlftp.mlit.go.jp/ksj/api/1.0b/index.php/app/getKSJURL.xml" \
              "?appId=%s&lang=%s&dataformat=%s&identifier=%s&prefCode=%s&" \
              "fiscalyear=%s" %(self.appId, self.lang, self.dataformat, \
                                self.identifier, self.prefCode, self.fiscalyear)

        resp = requests.get(url, timeout=10)
        tree = etree.fromstring(resp.content)

        for t in tree.iter():
            if t.tag == "zipFileUrl":
                self.download_zip(t.text)

    def download_zip(self,text):
        """
        指定したURLからZIPをダウンロードします。
        """

        filename = text.split('/')[-1]
        r = requests.get(text, stream=True)
        with open(filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
                    f.flush()

            self.uncompress_zip(filename)

    def uncompress_zip(self,filename):
        """
        ZIP ファイルを指定したディレクトリに展開します。
        """
        zfile = zipfile.ZipFile(filename)
        zfile.extractall(self.dir)

if __name__ == '__main__':
    w = WebAPI()
    w.get_url()

このようにファイルがダウンロードされました。
f:id:sanvarie:20190212150004p:plain

ファイルを読み込んだ結果です。
f:id:sanvarie:20190212150126p:plain

今回はデータの一部をダウンロードしてみましたが、全データをダウンロードして各データや年度ごとにフォルダ分けしてダウンロードファイルを格納する、みたいなプログラムも作ってみました。興味のある方は以下エントリーを読んでみてください。
www.gis-py.com

ArcPyレシピ集⑤ ~重複したフィーチャを抽出~

さて、本日は久しぶりにArcPyについて書いてみようと思います。

ArcPyとは

言わずもがなですが、ArcGISのデータを扱うためのPythonライブラリです。ArcPyに関しては当ブログで色々紹介していますので、興味のある方は以下エントリーを読んでみてください。

www.gis-py.com

www.gis-py.com

今回のゴール

GISデータを扱っているとたまに空間的に重複したデータに出くわすことがあります。こういった無駄なデータがあるとデータが重くなるだけでなく、システムの不具合の原因になる可能性もあります。今回はこういったデータを一括で抽出する方法を紹介しようと思います。

環境

Windows10 64bit
ArcGIS10.4.1
Python2.7.3

サンプルデータ

以下のようにポイントフィーチャクラス(平面直角座標系9系(JGD2000))を作成しました。
f:id:sanvarie:20190131100741p:plain

また、以下のようにポイントを作図しました(何点か重複している状態です)。

※「Key」カラムはキーとなるカラムと見立てて作りました。

f:id:sanvarie:20190131101841p:plain

サンプルコード

上記データの中にある重複したポイントデータを抽出するサンプルコードです。
(「Key」カラムの中身を出力します。)

# -*- coding: utf-8 -*-
import arcpy
from collections import Counter

class DuplicateGeometry(object):

    def  __init__(self):
        arcpy.env.workspace = ur"D:\gis-py\arcpy\data\SampleData.gdb"
        self.feature_class = u"SamplePoint"

    def check_dupulicate_feature(self):
        """重複しているフィーチャのFEAT_NUMをリストで返します

        arguments:
        none

        returns:
        duplicated_list -- FEAT_NUMのリスト

        """

        try:
            feature_list = []
            features_num_geo = []
            duplicated_list = []

            features = (row for row in arcpy.da.SearchCursor(self.feature_class, "SHAPE@XY"))
            feature_list = self.extract_data(features)
            features_num_geo = (row for row in arcpy.da.SearchCursor(self.feature_class, ["Key","SHAPE@XY"]))

            for ps in features_num_geo:
                for pl in feature_list:
                    if pl[0] == ps[1][0] and pl[1] == ps[1][1]:

                        duplicated_list.append(ps[0]) #重心XYが一致した場合FEAT_NUMを格納

        except Exception:
            return None
        else:
            return duplicated_list

    def extract_data(self,features):
        #重心XYが重複しているデータを抽出
        c = Counter(tuple(items) for items in features for items in items)
        return [items for items, count in c.most_common() if count > 1]

if __name__ == '__main__':
    d = DuplicateGeometry()
    duplicate_geometry = d.check_dupulicate_feature()
    print duplicate_geometry

実行すると以下のような結果になりました。
f:id:sanvarie:20190131102140p:plain

データを確認してみると、以下画像のようにポイントが重複していることがわかります。
f:id:sanvarie:20190131102317p:plain

今回抽出した他のデータも同様の状態ですが、同じような画像を貼り付けるだけになってしまうので、今回は割愛します。

このソースだとデータが多い時に少し時間がかかってしまうのが難ですね。もう少し効率の良い方法があればそれも今後紹介できればと思います。

今回はArcPyを使いましたが、ArcMapでも同様のことはできるかと思います。

例えば・・・
①対象のフィーチャクラスに「X」「Y」というカラムを追加
②ジオメトリ演算でそれぞれにXとYの座標を付与(以下画像参照)
③「②」のデータをEXCELか何かで重複チェック

f:id:sanvarie:20190131104119p:plain

これで同じ結果が得られるかと思います。

ArcGISユーザーだけど、ArcPyは敷居が高くてなかなか手が出せないという方もいらっしゃるかと思います。ただ、とても便利なライブラリなので、ぜひ使ってみてください。何かお困りのことがあれば、それに関するコメントを残していただければできる限り回答いたします(私にわかる範囲でですが)

簡単にではありますが、今回は以上です。