Solaristic Days

Fedora 23でPXEサーバを立てる

2016/02/14
ネットワークの設定を書き換えずにPXEサーバを立てたい!ということでProxyDHCPを使ったPXEの設定について。

パッケージのインストール
# dnf install dnsmasq syslinux-tftpboot

PXEサーバ設定

/etc/dnsmasq.d/proxy_pxe.conf
# function as a tftp server
enable-tftp

# Don't function as a DNS server:
port=0

# don't bind to 0.0.0.0
bind-interfaces

# root directory for files available via ftp.
tftp-root=/tftpboot

# This range(s) is for the public interface, where dnsmasq functions
# as a proxy DHCP server providing boot information but no IP leases.
# Any ip in the subnet will do, so you may just put your server NIC ip here.
# I used my router ip address
dhcp-range=192.168.1.0, proxy

# kill multicast
dhcp-option=vendor:PXEClient,6,2b

# disable reuse of the dhcp servername and filename fields as extra.
# option space. to avoid confusing some old or broken dhcp clients.
dhcp-no-override

# Log lots of extra information about DHCP transactions.
log-dhcp
log-queries

# PXE menu
pxe-prompt="Press F8 for boot menu", 10

# A boot service type of 0 is special, and will abort the
# net boot procedure and continue booting from local media.
pxe-service=X86PC, "Boot from local hard disk", 0

# The known types are x86PC, PC98, IA64_EFI, Alpha, Arc_x86,
# Intel_Lean_Client, IA32_EFI, BC_EFI, Xscale_EFI and X86-64_EFI
pxe-service=X86PC, "Boot from network", lpxelinux


ブートメニューを作る
# mkdir /tftpboot/pxelinux.cfg

/tftpboot/pxelinux.cfg/default
default vesamenu.c32
prompt 1
timeout 100

menu title ########## Boot Menu ##########
#menu background pxelinux.cfg/logo.png

label internet
    menu label ^Install Fedora from InterNET
    kernel http://192.168.1.10/netboot/fedora/vmlinuz
    initrd http://192.168.1.10/netboot/fedora/initrd.img
    append inst.stage2=http://download.fedoraproject.org/pub/fedora/linux/releases/23/Server/x86_64/os/ ip=dhcp

label live
    menu label ^Boot Live Linux(puppy)
    kernel http://192.168.1.10/netboot/puppy/vmlinuz
    initrd http://192.168.1.10/netboot/puppy/initrd.gz
    append root=/dev/ram0

label backup
    menu label backup/recovery(g4l)
    menu default
    linux http://192.168.1.10/netboot/g4l/bz4x3.3
    initrd http://192.168.1.10/netboot/g4l/ramdisk.lzma
    append root=/dev/ram0

label rescue
    menu label ^System Rescue
    linux http://192.168.1.10/netboot/systemrescue/rescue64
    initrd http://192.168.1.10/netboot/systemrescue/initram.igz
    append netboot=http://192.168.1.10/netboot/systemrescue/sysrcd.dat setkmap=jp scandelay=5

label memtest86
    menu label ^Memory test
    kernel memtest86plus
    append -

label local
    menu label ^Boot from Local drive
    localboot 0xffff


ブートイメージの作成

Fedora Install
# mkdir /tftpboot/fedora
# wget http://download.fedoraproject.org/pub/fedora/linux/releases/23/Server/x86_64/os/images/pxeboot/vmlinuz -O /tftpboot/fedora/vmlinuz
# wget http://download.fedoraproject.org/pub/fedora/linux/releases/23/Server/x86_64/os/images/pxeboot/initrd.img -O /tftpboot/fedora/initrd.img


Puppy
# mkdir puppy
# wget http://openlab.jp/puppylinux/download/puppy-5.7.1JP/precise-571JP.iso
# mount -o loop,ro -t iso9660 precise-571JP.iso puppy
# mkdir initrd
# cd initrd
# zcat ../puppy/initrd.gz | cpio -i -H newc -d
5329 blocks
# cp ../puppy/puppy_precise_5.7.1JP.sfs .
# find | cpio -o -H newc | gzip -4 > ../initrd.gz
257025 blocks
# cd ..
# mkdir /tftpboot/puppy
# mv initrd.gz /tftpboot/puppy/.
# cp puppy/vmlinuz /tftpboot/puppy/.


g4l
# mkdir /tftpboot/g4l
# wget http://netix.dl.sourceforge.net/project/g4l/g4l%20ISO%20images/g4l-v0.50.iso
# mount -o loop,ro -t iso9660 g4l-v0.50.iso g4l
# cp g4l/bz4x3.3 /tftpboot/g4l/.
# cp g4l/ramdisk.lzma /tftpboot/g4l/.


SystemRescueCD
# mkdir systemrescuecd
# wget http://jaist.dl.sourceforge.net/project/systemrescuecd/sysresccd-x86/4.7.1/systemrescuecd-x86-4.7.1.iso
# mount -o loop,ro -t iso9660 systemrescuecd-x86-4.7.1.iso systemrescuecd
# mkdir /tftpboot/systemrescuecd
# cp systemrescuecd/sysrcd.dat /tftpboot/systemrescuecd/.
# cp systemrescuecd/sysrcd.md5 /tftpboot/systemrescuecd/.
# cp systemrescuecd/isolinux/initram.igz /tftpboot/systemrescuecd/.
# cp systemrescuecd/isolinux/rescue64 /tftpboot/systemrescuecd/.
# umount systemrescuecd


Windows PE
WinPe-tchのダウンロード等


memtest86+
# wget http://www.memtest.org/download/5.01/memtest86+-5.01.zip
# unzip memtest86+-5.01.zip
# mv memtest86+-5.01.bin /tftpboot/memtest86plus


apacheの設定

/etc/httpd/conf.d/netboot.conf
#
# This configuration file maps net boot images
#
Alias /netboot /tftpboot

<location netboot="">
    AllowOverride All
    Require ip 192.168.1.0/24
</location>

SELinuxの設定

/tftpboot に設定されているtftpdir_tにhttpdのアクセス許可を追加するが、セキュリティは大丈夫?気になるなら、イメージは別ディレクトリに移してhttpd_sys_content_tのtcontextを設定するとよい。

pxe.te
module pxe 1.0;

require {
        type httpd_t;
        type tftpdir_t;
        class file { read open getattr };
}

#============= httpd_t ==============
allow httpd_t tftpdir_t:file { read open getattr };
# checkmodule -M -m -o pxe.mod pxe.te
checkmodule:  loading policy configuration from pxe.te
checkmodule:  policy configuration loaded
checkmodule:  writing binary representation (version 17) to pxe.mod
# semodule_package -o pxe.pp -m pxe.mod
# semodule -i pxe.pp
# restorecon -v -R /tftpboot

サービスを起動する
# systemctl start dnsmasq
# systemctl status dnsmasq
● dnsmasq.service - DNS caching server.
   Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2016-02-19 00:21:57 JST; 2s ago
 Main PID: 1690 (dnsmasq)
   CGroup: /system.slice/dnsmasq.service
           └─1690 /usr/sbin/dnsmasq -k

 2月 19 00:21:57 fedora.local.nerv.geek.jp systemd[1]: Started DNS caching server..
 2月 19 00:21:57 fedora.local.nerv.geek.jp systemd[1]: Starting DNS caching server....
 2月 19 00:21:57 fedora.local.nerv.geek.jp dnsmasq[1690]: started, version 2.75 DNS disabled
 2月 19 00:21:57 fedora.local.nerv.geek.jp dnsmasq[1690]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN DHCP DHCPv6 no-Lu...notify
 2月 19 00:21:57 fedora.local.nerv.geek.jp dnsmasq-dhcp[1690]: DHCP, proxy on subnet 192.168.1.0
 2月 19 00:21:57 fedora.local.nerv.geek.jp dnsmasq-tftp[1690]: TFTP root is /tftpboot
Hint: Some lines were ellipsized, use -l to show in full.
# systemctl enable dnsmasq
Created symlink from /etc/systemd/system/multi-user.target.wants/dnsmasq.service to /usr/lib/systemd/system/dnsmasq.service.
# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since 木 2016-02-18 22:29:52 JST; 1h 54min ago
 Main PID: 940 (/usr/sbin/httpd)
   Status: "Total requests: 9; Idle/Busy workers 100/0;Requests/sec: 0.00132; Bytes served/sec:  75KB/sec"
   CGroup: /system.slice/httpd.service
           ├─ 940 /usr/sbin/httpd -DFOREGROUND
           ├─1195 /usr/sbin/httpd -DFOREGROUND
           ├─1196 /usr/sbin/httpd -DFOREGROUND
           ├─1197 /usr/sbin/httpd -DFOREGROUND
           ├─1198 /usr/sbin/httpd -DFOREGROUND
           ├─1200 /usr/sbin/httpd -DFOREGROUND
           └─1391 /usr/sbin/httpd -DFOREGROUND

 2月 18 22:29:48 fedora.local.nerv.geek.jp systemd[1]: Starting The Apache HTTP Server...
 2月 18 22:29:51 fedora.local.nerv.geek.jp httpd[940]: [Thu Feb 18 22:29:51.237904 2016] [core:warn] [pid 940] AH00114: Useless us....conf.
 2月 18 22:29:52 fedora.local.nerv.geek.jp systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.

ポートを開ける
# firewall-cmd --add-service=http --permanent
# firewall-cmd --add-service=dhcp --permanent
# firewall-cmd --add-service=tftp --permanent
# firewall-cmd --add-service=proxy-dhcp --permanent
# firewall-cmd --reload
or
# firewall-cmd --set-default-zone=trusted
Read more ...

JavaScriptで空間演算

2015/03/04
先日FirefoxとQGISで行った位置情報の取得・加工を、JavaScriptで行ってみる。
スクレイピングにはnode-horsemanを使用した。Nightmareによく似た使いやすいモジュール。結果をGeoJSON形式で出力する。1ページ5秒のウエイトと、結果に5000件の制限を設けてある。
var fs = require('fs');

var Horseman = require('node-horseman');
var horseman = new Horseman();

var results = [];

function getResult() {
    return horseman
        .evaluate(function() {
            var features = [];
            $('table[id="searchResult"] tbody tr:gt(1)').each(function(item) {
                var lat = $.trim($(this).find('td:eq(4)').text()).split("°");
                var lat_deg = parseFloat(lat[0]);
                lat = lat[1].split("′");
                var lat_min = parseFloat(lat[0]) / 60;
                lat = lat[1].split("″");
                var lat_sec = parseFloat(lat[0]) / 3600;
                var lng = $.trim($(this).find('td:eq(5)').text()).split("°");
                var lng_deg = parseFloat(lng[0]);
                lng = lng[1].split("′");
                var lng_min = parseFloat(lng[0]) / 60;
                lng = lng[1].split("″");
                var lng_sec = parseFloat(lng[0]) / 3600;

                var feature = {
                    'type': 'Feature',
                    'geometry': {
                        'type': 'Point',
                        'coordinates': [
                            (lng_deg + lng_min + lng_sec),
                            (lat_deg + lat_min + lat_sec)
                        ]
                    },
                    'properties': {
                        'id' :            $.trim($(this).find('td:eq(0) a').text()),
                        'project' :       $.trim($(this).find('td:eq(1)').text()),
                        'investigation' : $.trim($(this).find('td:eq(2)').text()),
                        'organization' :  $.trim($(this).find('td:eq(3)').text()),
                        'length' :        $.trim($(this).find('td:eq(6)').text()),
                        'elevation' :     $.trim($(this).find('td:eq(7)').text()),
                        'fig' :           $.trim($(this).find('td:eq(8) a').attr("href")),
                        'result' :        $.trim($(this).find('td:eq(9) a').attr("href")),
                        'xml' :           $.trim($(this).find('td:eq(0) a').attr("href"))
                    }
                };
                features.push(feature);
            });
            return features;
        });
}

function hasNextPage() {
    return horseman.exists('td.nextLink a');
}

function scrape() {
    var result = getResult();
    results = results.concat(result);
    var page = horseman
        .evaluate(function() {
            return $('td.pageCount').text();
        });
    console.log(page);
    if (hasNextPage() && results.length < 5000){
        horseman
            .click('td.nextLink a')
            .waitForNextPage()
            .wait(5000);
        scrape();
    }
}

horseman
    .userAgent("Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0")
    .viewport(1024, 768)
    .open('http://www.kunijiban.pwri.go.jp/jp/denshikokudo/DB_Search/boringsearch.php')
    .type('input[name="tl_lat_deg"]', '34')
    .type('input[name="tl_lat_min"]', '23')
    .type('input[name="tl_lat_sec"]', '52')
    .type('input[name="tl_lon_deg"]', '131')
    .type('input[name="tl_lon_min"]', '54')
    .type('input[name="tl_lon_sec"]', '03')

    .type('input[name="br_lat_deg"]', '32')
    .type('input[name="br_lat_min"]', '51')
    .type('input[name="br_lat_sec"]', '40')
    .type('input[name="br_lon_deg"]', '133')
    .type('input[name="br_lon_min"]', '52')
    .type('input[name="br_lon_sec"]', '03')
    .click('input[value="検索"]')
    .waitForSelector('td.nextLink a')
//    .screenshot('kunijiban.png');

scrape();

var GeoJSON = {
    "type": "FeatureCollection",
    "crs": {
        "type": "name",
        "properties": {
            "name": "urn:ogc:def:crs:EPSG::4612"
        }
    },
    "features": results
};

fs.writeFile('kunijiban.geojson', JSON.stringify(GeoJSON, null, "    "));

horseman.close();

次に行政区域の境界のバッファを作成して、空間演算により取得した検索結果のうち、愛媛県のみを抽出する。

行政区域の地形データはQGISで作成してもよいが、下記のGeoJSONを使用した。

dataofjapan/land


空間演算には下記のモジュールを使用した。

bjornharrtell/jsts
JSTS Example

下記のhtmlをローカルに置いてブラウザで読みこめば、同じディレクトリにあるjapan.geojson, kunijiban.geojsonを読み込んで地図上に表示する。ただしFirefoxとChromeのみ(Chromeはローカルファイルが読めるように、"--allow-file-access-from-files"オプションを付けて起動する必要がある)。空間演算が割と重くて時間がかかるので、ハングしたようになるかも。
<!DOCTYPE html>
<html>

<head>
    <title>ボーリング柱状図</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css" />

    <script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
    <script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
    <script src="https://rawgithub.com/bjornharrtell/jsts/master/lib/javascript.util.js"></script>
    <script src="https://rawgithub.com/bjornharrtell/jsts/master/lib/jsts.js"></script>

    <link rel="kunijiban" type="application/json" href="kunijiban.geojson">
    <link rel="japan" type="application/json" href="japan.geojson">

    <style>
        html,
        body,
        #map {
            height: 100%;
            width: 100%;
            padding: 0px;
            margin: 0px;
        }
    </style>
</head>

<body>
    <div id="map"></div>

    <script>
        var map = L.map('map').setView([33.523342, 132.863776], 10);
        L.control.scale({'position':'bottomleft','metric':true,'imperial':false}).addTo(map);

        var distance = 5 / 111.12; // 5km
        var geoReader = new jsts.io.GeoJSONReader(),
            geoWriter = new jsts.io.GeoJSONWriter();

        var cyber = L.tileLayer('http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', {
            maxZoom: 18,
            attribution: '<a href="http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html" target="_blank">国土地理院</a>'
        }).addTo(map);
        map.addLayer(cyber);

        var gbank = L.tileLayer.wms("https://gbank.gsj.jp/ows/seamlessgeology200k_b", {
            layers: ['area,line,label'],
            format: 'image/png',
            transparent: true,
            opacity: 0.5,
            attribution: '<a href="https://gbank.gsj.jp/seamless/" target="_blank">シームレス地質図</a>'
        }).addTo(map);
        map.addLayer(gbank);

        L.control.layers({'地理院地図': cyber}, {'シームレス地質図': gbank}).addTo(map);

        function onEachFeature(feature, layer) {
            var popupContent = '<p><a href="' + feature.properties.fig + '" target="_blank">';
            popupContent += feature.properties.id + '</a><br />';
            popupContent += feature.properties.investigation + '</p>';

            layer.bindPopup(popupContent);
        }

        function createRegionBuffer() {
            return new Promise(function (resolve, reject) {
                $.getJSON($('link[rel="japan"]').attr("href"), function(data) {
                    var district;
                    data.features.forEach(function(item, index) {
                        if (item.properties.nam_ja == '愛媛県') district = item;
                    });
                    resolve(geoReader.read(district.geometry).buffer(distance));
                });
            });
        }

        function readBoringData(region) {
            return new Promise(function (resolve, reject) {
                $.getJSON($('link[rel="kunijiban"]').attr("href"), function(data) {
                    var inRegion = data.features.filter(function(item, index) {
                        return geoReader.read(item.geometry).within(region);
                    });
                    resolve(inRegion);
                });
            });
        }

        function renderRegionBuffer(region) {
            return new Promise(function (resolve, reject) {
                var buffer = geoWriter.write(region);
                L.geoJson(buffer, {
                    style: {
                        weight: 2,
                        color: "#999",
                        opacity: 1,
                        fillColor: "#B0DE5C",
                        fillOpacity: 0.8
                    }
                }).addTo(map);
                resolve(region);
            });
        }

        function renderBoringData(points) {
            L.geoJson(points, {
                onEachFeature: onEachFeature,

                pointToLayer: function(feature, latlng) {
                    return L.circleMarker(latlng, {
                        radius: 8,
                        fillColor: "#ff7800",
                        color: "#000",
                        weight: 1,
                        opacity: 1,
                        fillOpacity: 0.8
                    });
                }
            }).addTo(map);
        }

        createRegionBuffer()
//        .then(renderRegionBuffer)
        .then(readBoringData)
        .then(renderBoringData);
    </script>
</body>

</html>

マップは国土地理院のタイルと、日本シームレス地質図を使用している。

Read more ...

QGISによる空間演算

2015/02/26
電子国土Webシステムのサポート終了により、下記サイトでボーリング柱状図が地図上に表示できないのでなんとかする。

KuniJiban 国土地盤情報検索サイト

キーワードによる検索も可能だが、愛媛県に絞った検索は難しい。そこで「四国地方整備局」のキーワード検索の結果を、スクレイピングでぶっこ抜いた情報から、愛媛県だけを取り出してMy Mapsにプロットしてみる。
検索結果は約100ページ。取得にはiMacrosを使用する。ブラウザの操作を自動化するアプリで、「画面を保存して[>次へ]ボタンを押す」といった操作が自動化できる。

iMacrosの使い方 コマンド徹底解説

[ページめくりマクロの例]
VERSION BUILD=8890130 RECORDER=FX
TAB T=1
SET !EXTRACTTESTPOPUP NO
SET !LOOP 1
WAIT SECONDS=5
TAG POS=1 TYPE=TABLE ATTR=ID:searchResult EXTRACT=TXT
SAVEAS TYPE=HTM FOLDER=* FILE=+{{!NOW:yyyymmddhhnnss}}
TAG POS=1 TYPE=A ATTR=TXT:次へ>

この例だと、ページ毎のhtmlファイルが、ドキュメントフォルダのiMacros\Downloadsに保存される。htmlファイルは拡張子をEXCELのxlsに変更するだけで、テーブルのフォーマットを保ったまま、EXCELできれいに読み込めるのでいい感じに整形する。検索すれば複数のEXCELのBOOKをを結合する方法はいろいろあるが、最悪手作業でコピペ。
ちなみにハイパーリンクのURLが欲しい場合、マクロを使用しないと抜き出せないようだ。
'セル内のハイパーリンクの抜き出し関数
Function GetHyperlink(sRange As Range) As String
    Dim sp As Shape
    If sRange.Hyperlinks.Count > 0 Then
        GetHyperlink = sRange.Hyperlinks(1).Address
    End If
    For Each sp In ActiveSheet.Shapes
        If sRange.Address = sp.TopLeftCell.Address Then
            GetHyperlink = GetHyperlink & vbLf & sp.Hyperlink.Address
        End If
    Next
End Function

また、60進数の緯度経度が使用されているので、10進数に変換しておく必要もある。
=LEFT(E2,FIND("°",E2)-1)+MID(E2,FIND("°",E2)+1,FIND("′",E2)-FIND("°",E2)-1)/60+MID(E2,FIND("′",E2)+1,FIND("″",E2)-FIND("′",E2)-1)/3600
といった手間暇をかけてCSVに落とし込む。
ボーリングID,事業名,調査名,機関名称,緯度(60進),経度(60進),緯度(10進),経度(10進),掘進長(m),孔口標高(m),柱状図URL,土質試験結果URL,XML SK50337475003,,昭和63年度赤之井橋地質調査業務,松山河川国道事務所,33°59′10.2980″,133°33′39.0450″,33.9861939,133.5608458,13.5,18.6,http://www.kunijiban.pwri.go.jp/column/?xml=/SK/DATA/BEDSK50337475003.XML,,http://www.kunijiban.pwri.go.jp/data/SK/DATA/BEDSK50337475003.XML
SK50337485001,,昭和60年度川之江三島バイパス測量及び実施設計業務委託,松山河川国道事務所,33°59′14.5980″,133°33′56.5440″,33.9873883,133.5657067,10.15,15.67,http://www.kunijiban.pwri.go.jp/column/?xml=/SK/DATA/BEDSK50337485001.XML,,http://www.kunijiban.pwri.go.jp/data/SK/DATA/BEDSK50337485001.XML
SK50337495001,,昭和54年度11号線道設置に伴う地質調査,松山河川国道事務所,33°59′57.1930″,133°33′48.0430″,33.9992203,133.5633453,22.5,5.09,http://www.kunijiban.pwri.go.jp/column/?xml=/SK/DATA/BEDSK50337495001.XML,,http://www.kunijiban.pwri.go.jp/data/SK/DATA/BEDSK50337495001.XML
SK50337631001,,鮎戸瀬地区地すべり調査外1件,徳島河川国道事務所,33°56′57.2290″,133°45′53.8840″,33.9492303,133.7649678,21,188.5,http://www.kunijiban.pwri.go.jp/column/?xml=/SK/DATA/BEDSK50337631001.XML,,http://www.kunijiban.pwri.go.jp/data/SK/DATA/BEDSK50337631001.XML

しかしこのデータには、愛媛県をダイレクトに識別できる情報が位置情報しかないので、QGISを使って空間演算により愛媛県のみを切り出す。

QGISのプロジェクトの空間参照システムは、距離を使用するので、JDG2000/CS IV(EPSG:2446)にしておく。

行政区域データは、せっかくなので全国版のデータをダウンロードして、愛媛だけ切り出して使用する。

国土数値情報 行政区域データの詳細

ボーリング柱状図のCSVファイルの読み込みについては下記を参照。データの空間参照システムはJDG2000(EPSG:4612)。たぶん。

4.位置情報付きCSVファイルの読み込み - QGIS入門

両方を読み込んだ状態。

[属性テーブルを開く]から愛媛県の行政区ポリゴンの選択する。きれいに並んでいるので単純に選択すれば済むのだが、無駄に[式を使った地物選択]を使ってみる。こんな感じ。

愛媛県のすべての行政区ポリゴンが選択できるので、[編集]-[地物のコピー]&[編集]-[新規レイヤへの地物貼り付け]-[新規ベクタレイヤ]にする。

このままだと、愛媛県の境界にぎりぎり入っていない場所や海中が拾えないので、境界線を5km広げる。
[ベクタ]-[空間演算ツール]-[バッファ]を選択する。空間参照システムはJDG2000/CS IV(EPSG:2446)にする。

CSVから読み込んだボーリング位置は、そのままだと空間演算に使用できなかったので(5kmを分秒で指定すればいける?)、一度Shapeファイルに書き出す。レイヤーを右クリックして[名前を付けて保存]。空間参照システムはJDG2000/CS IV(EPSG:2446)にする。
切り出す。[ベクタ]-[空間演算ツール]-[クリップ]を選択する。

切り出し完了。

あとはレイヤー(clip)を、[名前を付けて保存]から形式をCSVで保存し、Googleドライブにアップロードする。
下記のマイマップで、位置をGoogleドライブからインポートする。Google Mapの空間参照システムはWGS 84(EPSG:4326)だが、JDG2000とほとんど変わらないそうなので、10進に変換した緯度経度のカラムをそのまま使用した。もしかすると元のデータがJDG2000ではなくWGS 84なのかも?

マイマップ

下記が大変参考になる
カッパ出没マップを作成する
Read more ...