Skip to content

Commit

Permalink
Added govmap 1:25000 source
Browse files Browse the repository at this point in the history
  • Loading branch information
extic committed Jan 23, 2023
1 parent d5a8bc3 commit b9a8988
Show file tree
Hide file tree
Showing 16 changed files with 62 additions and 75 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "map-downloader",
"productName": "MapDownloader",
"version": "1.0.3",
"version": "1.0.4",
"main": "dist/main/index.cjs",
"author": "Barak Levinson",
"license": "MIT",
Expand Down
6 changes: 3 additions & 3 deletions packages/common/maps/galil-tahton.data.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import * as pimage from "pureimage";
import { Bitmap } from "pureimage/types/bitmap";
import { Readable } from "stream";
import { MapData, UrlUsageType } from "./map.data";
import { MapData, UrlResult, UrlUsageType } from "./map.data";

export const mapDataGalilTahton: MapData = {
name: "Galil Tahton",

urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<string> => {
urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<UrlResult> => {
const zoomLevelStr = (zoomLevel + 4).toString();
return `https://v5.gis-net.co.il/proxy/proxy.ashx?http://10.237.72.71:8080/geoserver/gwc/service/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=Galil_tachton_2020:2020&STYLE=raster&FORMAT=image/jpeg&TILEMATRIXSET=Galil_tachton&TILEMATRIX=Galil_tachton:${zoomLevelStr}&TILEROW=${row}&TILECOL=${col}`;
return { url: `https://v5.gis-net.co.il/proxy/proxy.ashx?http://10.237.72.71:8080/geoserver/gwc/service/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=Galil_tachton_2020:2020&STYLE=raster&FORMAT=image/jpeg&TILEMATRIXSET=Galil_tachton&TILEMATRIX=Galil_tachton:${zoomLevelStr}&TILEROW=${row}&TILECOL=${col}` };
},

zoomLevelProvider: (zoomLevel: number): string => {
Expand Down
20 changes: 11 additions & 9 deletions packages/common/maps/govmap.data.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
import * as pimage from "pureimage";
import { Bitmap } from "pureimage/types/bitmap";
import { Readable } from "stream";
import { MapData, UrlUsageType } from "./map.data";
import { MapData, UrlResult, UrlUsageType, ZoomLayer } from "./map.data";

export const mapDataGovMap: MapData = {
name: "GovMap",

urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<string> => {
let zoomLevelStr = zoomLevel.toString(10).padStart(2, "0");
urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<UrlResult> => {
if (mapType === "1:25000" && (zoomLevel < 5 || zoomLevel > 9)) {
return { url: "", unsupported: true };
}
let zoomLevelStr = (mapType === "1:25000" ? zoomLevel - 5 : zoomLevel).toString(10).padStart(2, "0");
const rowStr = row.toString(16).padStart(8, "0");
const colStr = col.toString(16).padStart(8, "0");
const mapTypeStr = mapType === "Satellite" ? "020522B0B20R" : "B0B2309BNTL";
const mapTypeStr = mapType === "Satellite" ? "020522B0B20R" : mapType === "Street & Buildings" ? "B0B2309BNTL" : "11072021MAP25K";
const suffix = mapType === "Satellite" ? "jpg" : "png";
return `https://cdn.govmap.gov.il/${mapTypeStr}/L${zoomLevelStr}/R${rowStr}/C${colStr}.${suffix}`;
const domain = mapType === "1:25000" ? "cdnil.govmap.gov.il" : "cdn.govmap.gov.il";
return { url: `https://${domain}/${mapTypeStr}/L${zoomLevelStr}/R${rowStr}/C${colStr}.${suffix}` };
},

zoomLevelProvider: (zoomLevel: number): string => {
Expand All @@ -29,12 +33,10 @@ export const mapDataGovMap: MapData = {
},

decode: async (mapType: string, buffer: Buffer): Promise<Bitmap> => {
return await (mapType === "Satellite"
? pimage.decodeJPEGFromStream(Readable.from(buffer))
: pimage.decodePNGFromStream(Readable.from(buffer)));
return await (mapType === "Satellite" ? pimage.decodeJPEGFromStream(Readable.from(buffer)) : pimage.decodePNGFromStream(Readable.from(buffer)));
},

supportedMapTypes: ["Satellite", "Street & Buildings"],
supportedMapTypes: ["Satellite", "Street & Buildings", "1:25000"],

showScale: true,

Expand Down
6 changes: 3 additions & 3 deletions packages/common/maps/haifa.data.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import * as pimage from "pureimage";
import { Bitmap } from "pureimage/types/bitmap";
import { Readable } from "stream";
import { MapData, UrlUsageType } from "./map.data";
import { MapData, UrlResult, UrlUsageType } from "./map.data";

export const mapDataHaifa: MapData = {
name: "Haifa",

urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<string> => {
urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<UrlResult> => {
let zoomLevelStr = zoomLevel.toString();
const rowStr = row.toString();
const colStr = col.toString();
return `https://gisserver.haifa.muni.il/arcgiswebadaptor/rest/services/Orthophoto_202204/MapServer/tile/${zoomLevelStr}/${rowStr}/${colStr}?blankTile=false`;
return { url: `https://gisserver.haifa.muni.il/arcgiswebadaptor/rest/services/Orthophoto_202204/MapServer/tile/${zoomLevelStr}/${rowStr}/${colStr}?blankTile=false` };
},

zoomLevelProvider: (zoomLevel: number): string => {
Expand Down
6 changes: 3 additions & 3 deletions packages/common/maps/hod-hasharon.data.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import * as pimage from "pureimage";
import { Bitmap } from "pureimage/types/bitmap";
import { Readable } from "stream";
import { MapData, UrlUsageType } from "./map.data";
import { MapData, UrlResult, UrlUsageType } from "./map.data";

export const mapDataHodHasharon: MapData = {
name: "Hod Hasharon",

urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<string> => {
urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<UrlResult> => {
let zoomLevelStr = (zoomLevel + 3).toString();
const rowStr = row.toString();
const colStr = col.toString();
const mapTypeStr = mapType === "Satellite" ? "Hod_Hasharon_2022:2022" : "Hod_Hasharon_SHP:Hod_Hasharon_Reka";
return `https://v5.gis-net.co.il/proxy/proxy.ashx?http://10.237.72.70:8080/geoserver/gwc/service/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=${mapTypeStr}&STYLE=raster&FORMAT=image/jpeg&TILEMATRIXSET=Hod_Hasharon&TILEMATRIX=Hod_Hasharon:${zoomLevelStr}&TILEROW=${rowStr}&TILECOL=${colStr}`
return { url: `https://v5.gis-net.co.il/proxy/proxy.ashx?http://10.237.72.70:8080/geoserver/gwc/service/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=${mapTypeStr}&STYLE=raster&FORMAT=image/jpeg&TILEMATRIXSET=Hod_Hasharon&TILEMATRIX=Hod_Hasharon:${zoomLevelStr}&TILEROW=${rowStr}&TILECOL=${colStr}` };
},

zoomLevelProvider: (zoomLevel: number): string => {
Expand Down
7 changes: 6 additions & 1 deletion packages/common/maps/map.data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,14 @@ export enum UrlUsageType {
DOWNLOAD,
}

export type UrlResult = {
url: string;
unsupported?: boolean;
}

export type MapData = {
name: string;
urlProvider: (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number) => Promise<string>;
urlProvider: (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number) => Promise<UrlResult>;
getDownloaderHeaders?: () => any,
zoomLevelProvider: (zoomLevel: number) => string,
zoomFactorProvider: (zoomLevel: number, zoomIn: boolean) => number,
Expand Down
15 changes: 4 additions & 11 deletions packages/common/maps/mapy.data.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,14 @@
import * as pimage from "pureimage";
import { Bitmap } from "pureimage/types/bitmap";
import { Readable } from "stream";
import { MapData, UrlUsageType } from "./map.data";
import { MapData, UrlResult, UrlUsageType } from "./map.data";

export const mapDataMapy: MapData = {
name: "Mapy",

urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<string> => {
// if (usageType === UrlUsageType.VIEW) {
// return `https://mapserver.mapy.cz/base-en/${zoomLevel + 7}-${col}-${row}`;
// }

if (mapType === "Street") {
return `https://mapserver.mapy.cz/base-en/${zoomLevel + 7}-${col}-${row}`;
} else {
return `https://mapserver.mapy.cz/bing/${zoomLevel + 7}-${col}-${row}`;
}
urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<UrlResult> => {
const sourceType = mapType === "Street" ? "base-en" : "bing";
return { url: `https://mapserver.mapy.cz/${sourceType}/${zoomLevel + 7}-${col}-${row}` };
},

getDownloaderHeaders: () => {
Expand Down
6 changes: 3 additions & 3 deletions packages/common/maps/netanya.data.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import * as pimage from "pureimage";
import { Bitmap } from "pureimage/types/bitmap";
import { Readable } from "stream";
import { MapData, UrlUsageType } from "./map.data";
import { MapData, UrlResult, UrlUsageType } from "./map.data";

export const mapDataNetanya: MapData = {
name: "Netanya",

urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<string> => {
urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<UrlResult> => {
let zoomLevelStr = (zoomLevel + 3).toString();
const rowStr = row.toString();
const colStr = col.toString();
const mapTypeStr = mapType === "Satellite" ? "Netanya_2022_November:2022_November" : "Netanya_SHP:Netanya_Reka";
return `https://v5.gis-net.co.il/proxy/proxy.ashx?http://10.237.72.71:8080/geoserver/gwc/service/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=${mapTypeStr}&STYLE=raster&FORMAT=image/jpeg&TILEMATRIXSET=Netanya&TILEMATRIX=Netanya:${zoomLevelStr}&TILEROW=${rowStr}&TILECOL=${colStr}`
return { url: `https://v5.gis-net.co.il/proxy/proxy.ashx?http://10.237.72.71:8080/geoserver/gwc/service/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=${mapTypeStr}&STYLE=raster&FORMAT=image/jpeg&TILEMATRIXSET=Netanya&TILEMATRIX=Netanya:${zoomLevelStr}&TILEROW=${rowStr}&TILECOL=${colStr}` };
},

zoomLevelProvider: (zoomLevel: number): string => {
Expand Down
6 changes: 3 additions & 3 deletions packages/common/maps/tel-aviv.data.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import * as pimage from "pureimage";
import { Bitmap } from "pureimage/types/bitmap";
import { Readable } from "stream";
import { MapData, UrlUsageType } from "./map.data";
import { MapData, UrlResult, UrlUsageType } from "./map.data";

export const mapDataTelAviv: MapData = {
name: "Tel-Aviv",

urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<string> => {
urlProvider: async (usageType: UrlUsageType, mapType: string, zoomLevel: number, row: number, col: number): Promise<UrlResult> => {
let zoomLevelStr = zoomLevel + 13;
const rowStr = row.toString(10);
const colStr = col.toString(10);
return `https://gisn.tel-aviv.gov.il/arcgis/rest/services/WM/IView2Ortho2021WM/MapServer/tile/${zoomLevelStr}/${rowStr}/${colStr}?blankTile=false`
return { url: `https://gisn.tel-aviv.gov.il/arcgis/rest/services/WM/IView2Ortho2021WM/MapServer/tile/${zoomLevelStr}/${rowStr}/${colStr}?blankTile=false` };
},

zoomLevelProvider: (zoomLevel: number): string => {
Expand Down
38 changes: 20 additions & 18 deletions packages/main/downloader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ import * as fs from "fs";
import { BrowserWindow } from "electron";
import crypto from "crypto";
import fetch from "electron-fetch";
import { MapData, maps, UrlUsageType } from "../common/maps/map.data";
import { MapData, maps, UrlResult, UrlUsageType } from "../common/maps/map.data";
import { DownloadData } from "../common/download";

export const downloadOptions = {
canceled: false,
}
};

export const downloadMap = async (win: BrowserWindow, request: DownloadData) => {
if (!request) {
Expand Down Expand Up @@ -41,23 +41,25 @@ export const downloadMap = async (win: BrowserWindow, request: DownloadData) =>

console.log(`Downloading images: ${(progress * 100).toFixed(2)}%, x=${x}/${maxX}, y=${y}/${maxY}`);

const url = await getTileUrl(map, request.zoomLevel, request.startRow + y, request.startCol + x, request.mapType);
const { url, unsupported } = await getTileUrl(map, request.zoomLevel, request.startRow + y, request.startCol + x, request.mapType);
try {
const headers = map.getDownloaderHeaders ? map.getDownloaderHeaders() : {};
if (!unsupported) {
const headers = map.getDownloaderHeaders ? map.getDownloaderHeaders() : {};

const response = await fetch(url, headers); //, { responseType: "arraybuffer" });
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
const img1 = await map.decode(request.mapType, buffer);
const ctx = img1.getContext("2d");
let imageData = ctx.getImageData(0, 0, 256, 256);
for (let j = 0; j < 256; j++) {
const posY = j + y * 256 - request.startY;
if (posY >= 0) {
for (let i = 0; i < 256; i++) {
const posX = i + x * 256 - request.startX;
if (posX >= 0) {
overallCtx.fillPixelWithColor(posX, posY, imageData.getPixelRGBA(i, j));
const response = await fetch(url, headers); //, { responseType: "arraybuffer" });
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
const img1 = await map.decode(request.mapType, buffer);
const ctx = img1.getContext("2d");
let imageData = ctx.getImageData(0, 0, 256, 256);
for (let j = 0; j < 256; j++) {
const posY = j + y * 256 - request.startY;
if (posY >= 0) {
for (let i = 0; i < 256; i++) {
const posX = i + x * 256 - request.startX;
if (posX >= 0) {
overallCtx.fillPixelWithColor(posX, posY, imageData.getPixelRGBA(i, j));
}
}
}
}
Expand Down Expand Up @@ -89,6 +91,6 @@ export const downloadMap = async (win: BrowserWindow, request: DownloadData) =>
});
};

const getTileUrl = async (map: MapData, zoomLevel: number, row: number, col: number, mapType: string) => {
const getTileUrl = async (map: MapData, zoomLevel: number, row: number, col: number, mapType: string): Promise<UrlResult> => {
return await map.urlProvider(UrlUsageType.DOWNLOAD, mapType, zoomLevel, row, col);
};
Binary file removed packages/renderer/src/assets/electron.png
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 0 additions & 15 deletions packages/renderer/src/assets/vite.svg

This file was deleted.

Binary file removed packages/renderer/src/assets/vue.png
Binary file not shown.
1 change: 0 additions & 1 deletion packages/renderer/src/components/ControlsPane.vue
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,6 @@ export default defineComponent({
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.3em;
.vertical-item {
white-space: pre;
Expand Down
9 changes: 5 additions & 4 deletions packages/renderer/src/components/MapView.vue
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<template>
<div ref="map" class="map-view" v-draggable="{ dragged }" @wheel="zoom($event)">
<div v-for="tile in tiles" :key="tile.top * 100000 + tile.left" :style="{ left: tile.left + 'px', top: tile.top + 'px' }" class="tile">
<img :src="tile.url" @error="noTileImage($event)" alt="map tile" referrerpolicy="origin"/>
<!-- <div style="position: absolute; top: 2px; left: 2px; color: white">{{tile.col}} : {{tile.row}}</div> -->
<img v-if="!tile.unsupported" :src="tile.url" @error="noTileImage($event)" alt="map tile" referrerpolicy="origin"/>
<img v-else src="../assets/images/unsupported.png"/>
</div>
<crop-area v-if="store.showCrop && !isCropAreaTooSmall" />
<div class="map-info">
Expand Down Expand Up @@ -33,6 +33,7 @@ interface TileData {
readonly url: string;
readonly row: number;
readonly col: number;
readonly unsupported?: boolean;
}
export default defineComponent({
Expand Down Expand Up @@ -85,8 +86,8 @@ export default defineComponent({
for (let i = 0; i < tilesX; i++) {
const col = layer.centerTileX + Math.floor(store.posLeft / 256) - Math.floor(tilesX / 2) + i + 1;
const left = Math.floor(mapWidth / 2) - layer.centerTileOffsetX - (Math.floor(tilesX / 2) - i) * 256 - modPosX + 256;
const url = await selectedMap.urlProvider(UrlUsageType.VIEW, mapType.value, zoomLevel.value, row, col);
tiles.value.push({ left, top, url, row, col });
const { url, unsupported } = await selectedMap.urlProvider(UrlUsageType.VIEW, mapType.value, zoomLevel.value, row, col);
tiles.value.push({ left, top, url, row, col, unsupported });
}
}
};
Expand Down

0 comments on commit b9a8988

Please sign in to comment.