File:Log equi distance function of kyllikki saari murder site 1 v 1 r 1.png
![File:Log equi distance function of kyllikki saari murder site 1 v 1 r 1.png](https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Log_equi_distance_function_of_kyllikki_saari_murder_site_1_v_1_r_1.png/560px-Log_equi_distance_function_of_kyllikki_saari_murder_site_1_v_1_r_1.png?20230825093431)
Original file (696 × 745 pixels, file size: 144 KB, MIME type: image/png)
Captions
Captions
Summary
[edit]DescriptionLog equi distance function of kyllikki saari murder site 1 v 1 r 1.png |
English: Logarithm of equuivalent distance of murder site of Kyllikki Saari. Data: Grave location, Bike location. |
Date | |
Source | Own work |
Author | Merikanto |
This map is based on Folium OpenStreetMap.
https://www.openstreetmap.org/copyright
Data for locations comes from Finnish Wikipedia.
Locations: grave of Kyllikki Saari, bike was cached to Lellunlaakso.
Python 3 source code
-
- log distance function of points in mat
-
- test program only, maybe buggy
- here murder on Kyllikki Saari, Isojoki, Finland
- python 3 script
-
- 25.8.2023 v. 0000.0000.0000
import os
import time
import math
from math import pow
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import folium
from folium import plugins
from selenium import webdriver
import branca
from scipy.interpolate import griddata
import geojsoncontour
import scipy as sp
import scipy.ndimage
dimx=512
dimy=512
kenterlon1=21.951671
kenterlat1=62.144996
olon1=21.92
olat1=62.125
olon2=21.98
olat2=62.155
param_f = 1
param_g = 2
dist_coeff=10
sw1=[ olat1, olon1]
ne1=[ olat2, olon2]
rosmo1=np.zeros((dimy, dimx))
rosmo1=rosmo1*1
data =[[ 62.144996, 21.951671, 1. ],
[ 62.133412, 21.956548, 1. ]]
- [ 62.1406, 21.9481, 1. ]]
- minimum radius oh highest propab
- calculatend in below
- buffer_dist = 0
data2=np.array(data)
dimlon=olon2-olon1
dimlat=olat2-olat1
lonk=dimx/dimlon
latk=dimy/dimlat
lokx=[]
loky=[]
print(olon1, olat1, olon2, olat2)
for n in range (0, len(data2)):
lon0=data2[n,1]
lat0=data2[n,0]
print(lon0, lat0)
x=int((lon0-olon1)*lonk)
y=dimy-int((lat0-olat1)*latk)
#x=int((lon0-olon1)*lonk)
#y=int((lat0-olat1)*latk)
lokx.append(x)
loky.append(y)
print(lokx)
print(loky)
lenu=len(data2)
sites=[]
for n in range (0, lenu):
x=lokx[n]
y=loky[n]
#print(x,y)
pp=(x,y)
sites.append(pp)
print(sites)
- experimental only auto-radius ...
x00=lokx[0]
y00=loky[0]
xr=0
yr=0
for n in range (1, lenu):
x=lokx[n]-x00
y=loky[n]-y00
xr=xr+x
yr=yr+y
xr=xr/lenu
yr=yr/lenu
rr=int(math.sqrt(xr*xr+yr*yr))
print(rr)
buffer_dist =rr
- buffer_dist =0
- check this
- quit(-1)
p = 0
def phi( x, y, i, j ):
if abs(x-i) + abs(y-j) > buffer_dist:
return 1
else:
return 0
def phi2( x, y, i, j ):
if (math.sqrt( abs(x-i)*abs(x-i) + abs(y-j)*abs(y-j)) ) > buffer_dist:
return 1
else:
return 0
- rossmo, manhattan distance
- for x in range(dimx):
- for y in range(dimy):
- for site in sites:
- i = site[0]
- j = site[1]
- characteristic = phi(x, y, i, j)
- manhattan_dist = abs(x-i) + abs(y-j)
- try:
- p += characteristic / pow(manhattan_dist, param_f)
- except ZeroDivisionError:
- pass
- n = (1-characteristic)*pow(buffer_dist, (param_g-param_f))
- d = (2*buffer_dist)-characteristic
- d = pow(d, param_g)
- rosmo1[y,x]=p ## tsek it!
- p = 0
#print("")
- simple distance function
p=0
for x in range(dimx):
for y in range(dimy):
for site in sites:
i = site[0]
j = site[1]
ux=x-i
uy=y-j
if(ux==0): ux=1
if(uy==0): uy=1
distance=(math.sqrt(ux*ux+uy*uy))/buffer_dist
p0=math.log(math.pow(distance, -1))
p=p+p0
rosmo1[y,x]=p ## tsek it!
p = 0
imr=np.copy(rosmo1)
imb=np.copy(rosmo1)
img=np.copy(rosmo1)
ima=np.copy(rosmo1)
imr=imr*1
imb=imb*1
img=img*0
ima=255-imr
ima2=ima/256
rosmo2=np.dstack((imr, img, imb, ima))
- rosmo2=np.power(rosmo2, 1.5)*10
deltalon=dimlon/dimx
deltalat=dimlat/dimy
lontab=[]
lattab=[]
rostab=[]
for iy in range(0, dimy-1):
tlat=olat2-deltalat*iy
for ix in range(0, dimx-1):
tlon=olon1+deltalon*ix
tros=rosmo1[iy,ix]
lontab.append(tlon)
lattab.append(tlat)
rostab.append(tros)
lontab=np.asarray(lontab)
lattab=np.asarray(lattab)
rostab=np.asarray(rostab)
print (np.shape(lontab))
print (np.shape(lattab))
print (np.shape(rostab))
- quit(-1)
vmin=np.min(rostab)
vmax=np.max(rostab)
lon_arr = np.linspace(np.min(lontab), np.max(lontab), dimx)
lat_arr = np.linspace(np.min(lattab), np.max(lattab), dimy)
lon_mesh, lat_mesh = np.meshgrid(lon_arr, lat_arr)
ros_mesh = griddata((lontab, lattab), rostab, (lon_mesh, lat_mesh), method='linear')
sigma = [5, 5]
- ros_mesh = sp.ndimage.filters.gaussian_filter(ros_mesh, sigma, mode='constant')
levels=18
- colors = ['blue','royalblue', 'navy','pink', 'mediumpurple', 'darkorchid', 'plum', 'm', 'mediumvioletred', 'palevioletred', 'crimson',
- 'magenta','pink','red','yellow','orange', 'brown','green', 'darkgreen']
colors = ['blue','red']
levels = len(colors)
cm = branca.colormap.LinearColormap(colors, vmin=vmin, vmax=vmax).to_step(levels)
- levels=10
- levels=[1,10,100,200]
levels=1
- print()
contourf = plt.contourf(lon_mesh, lat_mesh, ros_mesh, levels, alpha=0.75, colors=colors, linestyles='None', vmin=vmin, vmax=vmax)
geojson = geojsoncontour.contourf_to_geojson(
contourf=contourf,
min_angle_deg=0.01,
ndigits=5,
stroke_width=0.5,
fill_opacity=0.1)
- quit(-1)
map = folium.Map(location=[kenterlat1, kenterlon1], TileProvider='OpenStreetMap', zoom_start=16, control_scale = True,)
- map = folium.Map(location=[kenterlat1, kenterlon1], TileProvider='Stamen Toner', zoom_start=16, control_scale = True,)
- map = folium.Map(location=[kenterlat1, kenterlon1], TileProvider='stamentoner’', zoom_start=16)
- plugins.HeatMap(data, radius = 50, min_opacity = 0.5, max_val = 1,gradient={.01: 'blue', 0.5: 'yellow', 1: 'red'}).add_to(map)
folium.raster_layers.ImageOverlay(rosmo2,
[[ olat1, olon1],[ olat2, olon2]],
opacity=0.5,
).add_to(map)
folium.LayerControl().add_to(map)
- Plot the contour on Folium map
- folium.GeoJson(
- geojson,
- style_function=lambda x: {
- 'color': "#ff0000",
- 'weight': 0.1,
- 'fillColor': None,
- 'opacity': 0.15,
- }
- ).add_to(map)
- folium.GeoJson( geojson, ).add_to(map)
- markers
- grave
- folium.Marker(location=[data[0][0], data[0][1]],html="Hauta",popup="Kyllikki saaren suohauta").add_to(map)
- bike
- folium.Marker(location=[data[1][0], data[1][1]],html="Pyörä", popup="Polkupyörän kätköpaikka").add_to(map)
latx1=data[0][0]
lonx1=data[0][1]
folium.Circle([latx1, lonx1], 45, fill_color="grey", opacity=1.0,color = 'grey', fill=True).add_child(folium.Popup('Hauta')).add_to(map)
folium.map.Marker(
[latx1 + 0.0001, lonx1 - 0.0001],
icon=folium.DivIcon(
icon_size=(150,36),
icon_anchor=(0,0),
html='
%s
' % "Hauta",
)
).add_to(map)
latx1=data[1][0]
lonx1=data[1][1]
folium.Circle([latx1, lonx1], 45, fill_color="blue", opacity=1.0,color = 'blue', fill=True).add_child(folium.Popup('Pyörä')).add_to(map)
folium.map.Marker(
[latx1 + 0.0001, lonx1 - 0.0001],
icon=folium.DivIcon(
icon_size=(150,36),
icon_anchor=(0,0),
html='
%s
' % "Pyörä",
)
).add_to(map)
map.fit_bounds([sw1, ne1])
- map.save("rossmotest1.html")
delay=5
- Save the map as an HTML file
fn='testmap.html'
tmpurl='file://{path}/{mapfile}'.format(path=os.getcwd(),mapfile=fn)
map.save(fn)
- quit(-1)
- Open a browser window...
browser = webdriver.Firefox()
- ..that displays the map...
browser.get(tmpurl)
- Give the map tiles some time to load
time.sleep(delay)
- Grab the screenshot
browser.save_screenshot('testmap.png')
- Close the browser
browser.quit()
Licensing
[edit]![w:en:Creative Commons](https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/CC_some_rights_reserved.svg/90px-CC_some_rights_reserved.svg.png)
![attribution](https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Cc-by_new_white.svg/24px-Cc-by_new_white.svg.png)
![share alike](https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Cc-sa_white.svg/24px-Cc-sa_white.svg.png)
- You are free:
- to share – to copy, distribute and transmit the work
- to remix – to adapt the work
- Under the following conditions:
- attribution – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
- share alike – If you remix, transform, or build upon the material, you must distribute your contributions under the same or compatible license as the original.
File history
Click on a date/time to view the file as it appeared at that time.
Date/Time | Thumbnail | Dimensions | User | Comment | |
---|---|---|---|---|---|
current | 09:34, 25 August 2023 | ![]() | 696 × 745 (144 KB) | Merikanto (talk | contribs) | Uploaded own work with UploadWizard |
You cannot overwrite this file.
File usage on Commons
There are no pages that use this file.