mirror of
https://github.com/Einundzwanzig-Podcast/einundzwanzig-portal.git
synced 2025-12-11 06:46:47 +00:00
osm data
This commit is contained in:
40
app/Console/Commands/Map/CreateGeoJsonPolygon.php
Normal file
40
app/Console/Commands/Map/CreateGeoJsonPolygon.php
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands\Map;
|
||||||
|
|
||||||
|
use App\Models\Meetup;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
|
class CreateGeoJsonPolygon extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'map:polygon';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = 'Command description';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$meetups = Meetup::query()
|
||||||
|
->with([
|
||||||
|
'city',
|
||||||
|
])
|
||||||
|
->get();
|
||||||
|
|
||||||
|
foreach ($meetups as $meetup) {
|
||||||
|
dd($meetup->city->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Command::SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
114
app/Http/Livewire/Meetup/PrepareForBtcMapItem.php
Normal file
114
app/Http/Livewire/Meetup/PrepareForBtcMapItem.php
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Livewire\Meetup;
|
||||||
|
|
||||||
|
use App\Models\Meetup;
|
||||||
|
use Illuminate\Support\Facades\Http;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
use Livewire\Component;
|
||||||
|
|
||||||
|
class PrepareForBtcMapItem extends Component
|
||||||
|
{
|
||||||
|
public Meetup $meetup;
|
||||||
|
|
||||||
|
public $wikipediaSearchResults;
|
||||||
|
public $osmSearchResults;
|
||||||
|
public $osmSearchResultsState;
|
||||||
|
|
||||||
|
public $selectedItem;
|
||||||
|
|
||||||
|
public function mount()
|
||||||
|
{
|
||||||
|
$response = Http::acceptJson()
|
||||||
|
->get(
|
||||||
|
'https://nominatim.openstreetmap.org/search?city='.$this->meetup->city->name.'&format=json&polygon_geojson=1'
|
||||||
|
);
|
||||||
|
$this->osmSearchResults = $response->json();
|
||||||
|
|
||||||
|
$response = Http::acceptJson()
|
||||||
|
->get(
|
||||||
|
'https://nominatim.openstreetmap.org/search?state='.$this->meetup->city->name.'&format=json&polygon_geojson=1'
|
||||||
|
);
|
||||||
|
$this->osmSearchResultsState = $response->json();
|
||||||
|
|
||||||
|
if ($this->meetup->city->osm_relation) {
|
||||||
|
$this->selectedItem = $this->meetup->city->osm_relation;
|
||||||
|
|
||||||
|
$wikipediaUrl = 'https://query.wikidata.org/sparql?query=SELECT%20%3Fpopulation%20WHERE%20%7B%0A%20%20SERVICE%20wikibase%3Amwapi%20%7B%0A%20%20%20%20%20%20bd%3AserviceParam%20mwapi%3Asearch%20%22'.urlencode($this->meetup->city->name).'%22%20.%20%20%20%20%0A%20%20%20%20%20%20bd%3AserviceParam%20mwapi%3Alanguage%20%22en%22%20.%20%20%20%20%0A%20%20%20%20%20%20bd%3AserviceParam%20wikibase%3Aapi%20%22EntitySearch%22%20.%0A%20%20%20%20%20%20bd%3AserviceParam%20wikibase%3Aendpoint%20%22www.wikidata.org%22%20.%0A%20%20%20%20%20%20bd%3AserviceParam%20wikibase%3Alimit%201%20.%0A%20%20%20%20%20%20%3Fitem%20wikibase%3AapiOutputItem%20mwapi%3Aitem%20.%0A%20%20%7D%0A%20%20%3Fitem%20wdt%3AP1082%20%3Fpopulation%0A%7D';
|
||||||
|
$response = Http::acceptJson()
|
||||||
|
->get(
|
||||||
|
$wikipediaUrl
|
||||||
|
);
|
||||||
|
$this->wikipediaSearchResults = $response->json();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function selectItem($index, bool $isState = false)
|
||||||
|
{
|
||||||
|
if ($isState) {
|
||||||
|
$this->selectedItem = $this->osmSearchResultsState[$index];
|
||||||
|
} else {
|
||||||
|
$this->selectedItem = $this->osmSearchResults[$index];
|
||||||
|
}
|
||||||
|
Storage::disk('geo')
|
||||||
|
->put('geojson_'.$this->selectedItem['osm_id'].'.json',
|
||||||
|
json_encode($this->selectedItem['geojson'], JSON_THROW_ON_ERROR));
|
||||||
|
$input = storage_path('app/geo/geojson_'.$this->selectedItem['osm_id'].'.json');
|
||||||
|
$output = storage_path('app/geo/output_'.$this->selectedItem['osm_id'].'.json');
|
||||||
|
exec('mapshaper '.$input.' -simplify dp 4% -o '.$output);
|
||||||
|
Storage::disk('geo')
|
||||||
|
->put(
|
||||||
|
'trimmed_'.$this->selectedItem['osm_id'].'.json',
|
||||||
|
str(Storage::disk('geo')
|
||||||
|
->get('output_'.$this->selectedItem['osm_id'].'.json'))
|
||||||
|
->after('{"type":"GeometryCollection", "geometries": [')
|
||||||
|
->beforeLast(']}')
|
||||||
|
->toString()
|
||||||
|
);
|
||||||
|
$this->meetup->city->osm_relation = $this->selectedItem;
|
||||||
|
$this->meetup->city->simplified_geojson = json_decode(trim(Storage::disk('geo')
|
||||||
|
->get('trimmed_'.$this->selectedItem['osm_id'].'.json')),
|
||||||
|
false, 512, JSON_THROW_ON_ERROR);
|
||||||
|
$this->meetup->city->population = 0;
|
||||||
|
$this->meetup->city->population_date = date('Y');
|
||||||
|
$this->meetup->city->save();
|
||||||
|
|
||||||
|
return to_route('osm.meetups.item', ['meetup' => $this->meetup]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPercent($percent)
|
||||||
|
{
|
||||||
|
$input = storage_path('app/geo/geojson_'.$this->selectedItem['osm_id'].'.json');
|
||||||
|
$output = storage_path('app/geo/output_'.$this->selectedItem['osm_id'].'.json');
|
||||||
|
exec('mapshaper '.$input.' -simplify dp '.$percent.'% -o '.$output);
|
||||||
|
Storage::disk('geo')
|
||||||
|
->put(
|
||||||
|
'trimmed_'.$this->selectedItem['osm_id'].'.json',
|
||||||
|
str(Storage::disk('geo')
|
||||||
|
->get('output_'.$this->selectedItem['osm_id'].'.json'))
|
||||||
|
->after('{"type":"GeometryCollection", "geometries": [')
|
||||||
|
->beforeLast(']}')
|
||||||
|
->toString()
|
||||||
|
);
|
||||||
|
$this->meetup->city->simplified_geojson = json_decode(trim(Storage::disk('geo')
|
||||||
|
->get('trimmed_'.$this->selectedItem['osm_id'].'.json')),
|
||||||
|
false, 512, JSON_THROW_ON_ERROR);
|
||||||
|
$this->meetup->city->save();
|
||||||
|
|
||||||
|
return to_route('osm.meetups.item', ['meetup' => $this->meetup]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function takePop($value)
|
||||||
|
{
|
||||||
|
$this->meetup->city->population = $value;
|
||||||
|
$this->meetup->city->population_date = date('Y');
|
||||||
|
$this->meetup->city->save();
|
||||||
|
|
||||||
|
return to_route('osm.meetups.item', ['meetup' => $this->meetup]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.meetup.prepare-for-btc-map-item');
|
||||||
|
}
|
||||||
|
}
|
||||||
13
app/Http/Livewire/Meetup/PrepareForBtcMapTable.php
Normal file
13
app/Http/Livewire/Meetup/PrepareForBtcMapTable.php
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Livewire\Meetup;
|
||||||
|
|
||||||
|
use Livewire\Component;
|
||||||
|
|
||||||
|
class PrepareForBtcMapTable extends Component
|
||||||
|
{
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.meetup.prepare-for-btc-map-table');
|
||||||
|
}
|
||||||
|
}
|
||||||
51
app/Http/Livewire/Tables/MeetupForBtcMapTable.php
Normal file
51
app/Http/Livewire/Tables/MeetupForBtcMapTable.php
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Livewire\Tables;
|
||||||
|
|
||||||
|
use App\Models\Meetup;
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
|
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
||||||
|
use Rappasoft\LaravelLivewireTables\Views\Column;
|
||||||
|
|
||||||
|
class MeetupForBtcMapTable extends DataTableComponent
|
||||||
|
{
|
||||||
|
public function configure(): void
|
||||||
|
{
|
||||||
|
$this
|
||||||
|
->setPrimaryKey('id')
|
||||||
|
->setAdditionalSelects([
|
||||||
|
'osm_relation',
|
||||||
|
'simplified_geojson',
|
||||||
|
'population',
|
||||||
|
'population_date',
|
||||||
|
])
|
||||||
|
->setPerPageAccepted([
|
||||||
|
100000,
|
||||||
|
])
|
||||||
|
->setPerPage(100000);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function columns(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
Column::make("Id", "id")
|
||||||
|
->sortable(),
|
||||||
|
Column::make("Name", "name")
|
||||||
|
->sortable(),
|
||||||
|
Column::make("City", "city.name")
|
||||||
|
->sortable(),
|
||||||
|
Column::make("Country", "city.country.name")
|
||||||
|
->sortable(),
|
||||||
|
Column::make("Actions")
|
||||||
|
->label(fn($row, Column $column) => view('columns.meetups.osm-actions', ['row' => $row])),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function builder(): Builder
|
||||||
|
{
|
||||||
|
return Meetup::query()
|
||||||
|
->with([
|
||||||
|
'city.country',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,8 +28,10 @@ class City extends Model
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
'id' => 'integer',
|
'id' => 'integer',
|
||||||
'country_id' => 'integer',
|
'country_id' => 'integer',
|
||||||
|
'osm_relation' => 'json',
|
||||||
|
'simplified_geojson' => 'json',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected static function booted()
|
protected static function booted()
|
||||||
|
|||||||
@@ -36,6 +36,12 @@ return [
|
|||||||
'throw' => false,
|
'throw' => false,
|
||||||
],
|
],
|
||||||
|
|
||||||
|
'geo' => [
|
||||||
|
'driver' => 'local',
|
||||||
|
'root' => storage_path('app/geo'),
|
||||||
|
'throw' => false,
|
||||||
|
],
|
||||||
|
|
||||||
'public' => [
|
'public' => [
|
||||||
'driver' => 'local',
|
'driver' => 'local',
|
||||||
'root' => storage_path('app/public'),
|
'root' => storage_path('app/public'),
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration {
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('cities', function (Blueprint $table) {
|
||||||
|
$table->json('osm_relation')
|
||||||
|
->nullable();
|
||||||
|
$table->json('simplified_geojson')
|
||||||
|
->nullable();
|
||||||
|
$table->unsignedBigInteger('population')
|
||||||
|
->nullable();
|
||||||
|
$table->string('population_date')
|
||||||
|
->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('cities', function (Blueprint $table) {
|
||||||
|
//
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -125,6 +125,13 @@ class DatabaseSeeder extends Seeder
|
|||||||
'longitude' => 8.65639,
|
'longitude' => 8.65639,
|
||||||
'created_by' => 1,
|
'created_by' => 1,
|
||||||
]);
|
]);
|
||||||
|
City::create([
|
||||||
|
'country_id' => 1,
|
||||||
|
'name' => 'Hessen',
|
||||||
|
'latitude' => 50.526501,
|
||||||
|
'longitude' => 9.004440,
|
||||||
|
'created_by' => 1,
|
||||||
|
]);
|
||||||
Venue::create([
|
Venue::create([
|
||||||
'city_id' => 1,
|
'city_id' => 1,
|
||||||
'name' => 'The Blue Studio Coworking (Füssen)',
|
'name' => 'The Blue Studio Coworking (Füssen)',
|
||||||
@@ -376,9 +383,9 @@ Deshalb werden Sie von mir in diesem Kurs leicht verständlich an das Thema hera
|
|||||||
Artisan::call(ReadAndSyncPodcastFeeds::class);
|
Artisan::call(ReadAndSyncPodcastFeeds::class);
|
||||||
Artisan::call(SyncOpenBooks::class);
|
Artisan::call(SyncOpenBooks::class);
|
||||||
Meetup::create([
|
Meetup::create([
|
||||||
'city_id' => 1,
|
'city_id' => 6,
|
||||||
'name' => 'Einundzwanzig ' . str()->random(5),
|
'name' => 'Einundzwanzig Hessen',
|
||||||
'telegram_link' => 'https://t.me/EinundzwanzigKempten',
|
'telegram_link' => 'https://t.me/EinundzwanzigHessen',
|
||||||
'created_by' => 1,
|
'created_by' => 1,
|
||||||
]);
|
]);
|
||||||
MeetupEvent::create([
|
MeetupEvent::create([
|
||||||
|
|||||||
@@ -697,5 +697,6 @@
|
|||||||
"no location set": "kein Ort gesetzt",
|
"no location set": "kein Ort gesetzt",
|
||||||
"Open on Youtube": "Auf Youtube öffnen",
|
"Open on Youtube": "Auf Youtube öffnen",
|
||||||
"You do not have permission to view the page.": "Du hast keine Berechtigung, die Seite anzuzeigen.",
|
"You do not have permission to view the page.": "Du hast keine Berechtigung, die Seite anzuzeigen.",
|
||||||
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "Bitte kontaktiere die Administratoren für neue Dateitypen, ansonsten packe die Dateien in ein ZIP! (Derzeit: PDF, ZIP)"
|
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "Bitte kontaktiere die Administratoren für neue Dateitypen, ansonsten packe die Dateien in ein ZIP! (Derzeit: PDF, ZIP)",
|
||||||
}
|
"load more...": ""
|
||||||
|
}
|
||||||
@@ -691,5 +691,6 @@
|
|||||||
"no location set": "",
|
"no location set": "",
|
||||||
"Open on Youtube": "",
|
"Open on Youtube": "",
|
||||||
"You do not have permission to view the page.": "",
|
"You do not have permission to view the page.": "",
|
||||||
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": ""
|
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "",
|
||||||
}
|
"load more...": ""
|
||||||
|
}
|
||||||
@@ -691,5 +691,6 @@
|
|||||||
"no location set": "no hay ubicación establecida",
|
"no location set": "no hay ubicación establecida",
|
||||||
"Open on Youtube": "Abrir en Youtube",
|
"Open on Youtube": "Abrir en Youtube",
|
||||||
"You do not have permission to view the page.": "No tienes permiso para ver la página.",
|
"You do not have permission to view the page.": "No tienes permiso para ver la página.",
|
||||||
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "Si deseas nuevos tipos de archivo, pónte en contacto con los administradores; de lo contrario, envíe los archivos en un ZIP. (Actualmente: PDF, ZIP)"
|
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "Si deseas nuevos tipos de archivo, pónte en contacto con los administradores; de lo contrario, envíe los archivos en un ZIP. (Actualmente: PDF, ZIP)",
|
||||||
}
|
"load more...": ""
|
||||||
|
}
|
||||||
@@ -692,5 +692,6 @@
|
|||||||
"no location set": "",
|
"no location set": "",
|
||||||
"Open on Youtube": "",
|
"Open on Youtube": "",
|
||||||
"You do not have permission to view the page.": "",
|
"You do not have permission to view the page.": "",
|
||||||
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": ""
|
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "",
|
||||||
|
"load more...": ""
|
||||||
}
|
}
|
||||||
@@ -692,5 +692,6 @@
|
|||||||
"no location set": "",
|
"no location set": "",
|
||||||
"Open on Youtube": "",
|
"Open on Youtube": "",
|
||||||
"You do not have permission to view the page.": "",
|
"You do not have permission to view the page.": "",
|
||||||
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": ""
|
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "",
|
||||||
|
"load more...": ""
|
||||||
}
|
}
|
||||||
@@ -692,5 +692,6 @@
|
|||||||
"no location set": "",
|
"no location set": "",
|
||||||
"Open on Youtube": "",
|
"Open on Youtube": "",
|
||||||
"You do not have permission to view the page.": "",
|
"You do not have permission to view the page.": "",
|
||||||
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": ""
|
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "",
|
||||||
|
"load more...": ""
|
||||||
}
|
}
|
||||||
@@ -692,5 +692,6 @@
|
|||||||
"no location set": "",
|
"no location set": "",
|
||||||
"Open on Youtube": "",
|
"Open on Youtube": "",
|
||||||
"You do not have permission to view the page.": "",
|
"You do not have permission to view the page.": "",
|
||||||
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": ""
|
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "",
|
||||||
|
"load more...": ""
|
||||||
}
|
}
|
||||||
@@ -692,5 +692,6 @@
|
|||||||
"no location set": "",
|
"no location set": "",
|
||||||
"Open on Youtube": "",
|
"Open on Youtube": "",
|
||||||
"You do not have permission to view the page.": "",
|
"You do not have permission to view the page.": "",
|
||||||
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": ""
|
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "",
|
||||||
|
"load more...": ""
|
||||||
}
|
}
|
||||||
@@ -692,5 +692,6 @@
|
|||||||
"no location set": "",
|
"no location set": "",
|
||||||
"Open on Youtube": "",
|
"Open on Youtube": "",
|
||||||
"You do not have permission to view the page.": "",
|
"You do not have permission to view the page.": "",
|
||||||
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": ""
|
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "",
|
||||||
|
"load more...": ""
|
||||||
}
|
}
|
||||||
@@ -666,5 +666,6 @@
|
|||||||
"no location set": "",
|
"no location set": "",
|
||||||
"Open on Youtube": "",
|
"Open on Youtube": "",
|
||||||
"You do not have permission to view the page.": "",
|
"You do not have permission to view the page.": "",
|
||||||
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": ""
|
"Please contact the admins for new file types, otherwise pack the files in a ZIP! (Currently: PDF, ZIP)": "",
|
||||||
|
"load more...": ""
|
||||||
}
|
}
|
||||||
24
resources/views/columns/meetups/osm-actions.blade.php
Normal file
24
resources/views/columns/meetups/osm-actions.blade.php
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<div class="flex flex-col space-y-1">
|
||||||
|
<div>
|
||||||
|
@if($row->osm_relation)
|
||||||
|
has OSM relation
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
population {{ $row->population }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
@if($row->population_date)
|
||||||
|
population date {{ $row->population_date }}
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<x-button
|
||||||
|
xs
|
||||||
|
amber
|
||||||
|
:href="route('osm.meetups.item', ['meetup' => $row])"
|
||||||
|
>
|
||||||
|
Open OSM Item
|
||||||
|
</x-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -29,6 +29,7 @@
|
|||||||
<script src="{{ asset('vendor/jvector/maps/pl.js') }}"></script>
|
<script src="{{ asset('vendor/jvector/maps/pl.js') }}"></script>
|
||||||
<script src="https://kit.fontawesome.com/03bc14bd1e.js" crossorigin="anonymous"></script>
|
<script src="https://kit.fontawesome.com/03bc14bd1e.js" crossorigin="anonymous"></script>
|
||||||
<script src="{{ asset('dist/smoothscroll.js') }}"></script>
|
<script src="{{ asset('dist/smoothscroll.js') }}"></script>
|
||||||
|
@mapstyles
|
||||||
@mapscripts
|
@mapscripts
|
||||||
<wireui:scripts/>
|
<wireui:scripts/>
|
||||||
<x-comments::scripts/>
|
<x-comments::scripts/>
|
||||||
@@ -37,7 +38,6 @@
|
|||||||
<x-comments::styles/>
|
<x-comments::styles/>
|
||||||
<x-embed-styles />
|
<x-embed-styles />
|
||||||
@livewireStyles
|
@livewireStyles
|
||||||
@mapstyles
|
|
||||||
<style>
|
<style>
|
||||||
.comments {
|
.comments {
|
||||||
--comments-color-background: rgb(34, 34, 34);
|
--comments-color-background: rgb(34, 34, 34);
|
||||||
|
|||||||
@@ -0,0 +1,104 @@
|
|||||||
|
<div class="p-6 w-full" wire:loading.class="opacity-50">
|
||||||
|
|
||||||
|
<div class="max-w-none text-white flex flex-col space-y-4">
|
||||||
|
<a href="{{ route('osm.meetups') }}">Zurück</a>
|
||||||
|
<div class="grid grid-cols-2 gap-2">
|
||||||
|
<div>
|
||||||
|
<h1>Search city: {{ $meetup->city->name }}</h1>
|
||||||
|
<h1>OSM API Response</h1>
|
||||||
|
<div class="flex flex-col space-y-2">
|
||||||
|
@foreach($osmSearchResults as $item)
|
||||||
|
<code class="w-full">
|
||||||
|
<div wire:key="osmItemCity_{{ $loop->index }}" class="cursor-pointer underline" wire:click="selectItem({{ $loop->index }})">
|
||||||
|
{{ $item['display_name'] }}
|
||||||
|
</div>
|
||||||
|
</code>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h1>Search state: {{ $meetup->city->name }}</h1>
|
||||||
|
<h1>OSM API Response</h1>
|
||||||
|
<div class="flex flex-col space-y-2">
|
||||||
|
@foreach($osmSearchResultsState as $item)
|
||||||
|
<code class="w-full">
|
||||||
|
<div wire:key="osmItemState_{{ $loop->index }}" class="cursor-pointer underline" wire:click="selectItem({{ $loop->index }}, true)">
|
||||||
|
{{ $item['display_name'] }}
|
||||||
|
</div>
|
||||||
|
</code>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
@if($selectedItem)
|
||||||
|
geojson created
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
<h1>Current data [points: {{ count($meetup->city->simplified_geojson['coordinates'][0] ?? []) }}]</h1>
|
||||||
|
<div class="flex space-x-2">
|
||||||
|
<div class="cursor-pointer font-bold underline" wire:click="setPercent(7)">7%</div>
|
||||||
|
<div class="cursor-pointer font-bold underline" wire:click="setPercent(6)">6%</div>
|
||||||
|
<div class="cursor-pointer font-bold underline" wire:click="setPercent(5)">5%</div>
|
||||||
|
<div class="cursor-pointer font-bold underline" wire:click="setPercent(4)">4%</div>
|
||||||
|
<div class="cursor-pointer font-bold underline" wire:click="setPercent(3)">3%</div>
|
||||||
|
<div class="cursor-pointer font-bold underline" wire:click="setPercent(2)">2%</div>
|
||||||
|
<div class="cursor-pointer font-bold underline" wire:click="setPercent(1)">1%</div>
|
||||||
|
<div class="cursor-pointer font-bold underline" wire:click="setPercent(0.75)">0.75%</div>
|
||||||
|
<div class="cursor-pointer font-bold underline" wire:click="setPercent(0.5)">0.5%</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
@if($meetup->city->simplified_geojson)
|
||||||
|
<h1>Simplified geojson</h1>
|
||||||
|
<pre
|
||||||
|
class="overflow-x-auto py-4">{{ json_encode($meetup->city->simplified_geojson, JSON_THROW_ON_ERROR) }}</pre>
|
||||||
|
<div
|
||||||
|
class="my-4"
|
||||||
|
x-data="{
|
||||||
|
init() {
|
||||||
|
var map = L.map($refs.map)
|
||||||
|
.setView([{{ $meetup->city->longitude }}, {{ $meetup->city->latitude }}], 13);
|
||||||
|
|
||||||
|
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
|
||||||
|
|
||||||
|
var geojsonFeature = {
|
||||||
|
'type': 'Feature',
|
||||||
|
'geometry': @js($meetup->city->simplified_geojson)
|
||||||
|
};
|
||||||
|
console.log(geojsonFeature);
|
||||||
|
L.geoJSON(geojsonFeature).addTo(map);
|
||||||
|
let geoJSON = L.geoJson(geojsonFeature).addTo(map);
|
||||||
|
map.fitBounds(geoJSON.getBounds());
|
||||||
|
}
|
||||||
|
}">
|
||||||
|
<div x-ref="map" style="width: 80vw; height: 30vh;"></div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col">
|
||||||
|
@if($meetup->city->osm_relation)
|
||||||
|
<code>
|
||||||
|
osm_id: {{ $meetup->city->osm_relation['osm_id'] }}
|
||||||
|
</code>
|
||||||
|
<code>
|
||||||
|
display_name: {{ $meetup->city->osm_relation['display_name'] }}
|
||||||
|
</code>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
<h1>Wikipedia Search Results</h1>
|
||||||
|
<div class="flex space-x-2">
|
||||||
|
@foreach($wikipediaSearchResults['results']['bindings'] ?? [] as $pop)
|
||||||
|
<div wire:key="pop_{{ $loop->index }}" class="cursor-pointer underline font-bold" wire:click="takePop({{ $pop['population']['value'] }})">
|
||||||
|
population: {{ number_format($pop['population']['value']) }}
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
<h1>DB population</h1>
|
||||||
|
<code>
|
||||||
|
population: {{ $meetup->city->population }}
|
||||||
|
</code>
|
||||||
|
<code>
|
||||||
|
population date: {{ $meetup->city->population_date }}
|
||||||
|
</code>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<div class="p-6">
|
||||||
|
<livewire:tables.meetup-for-btc-map-table/>
|
||||||
|
</div>
|
||||||
@@ -175,8 +175,20 @@ Route::middleware([
|
|||||||
'needMeetup',
|
'needMeetup',
|
||||||
])
|
])
|
||||||
->group(function () {
|
->group(function () {
|
||||||
|
/*
|
||||||
|
* Dashboard
|
||||||
|
* */
|
||||||
Route::get('/dashboard', function () {
|
Route::get('/dashboard', function () {
|
||||||
return view('dashboard');
|
return view('dashboard');
|
||||||
})
|
})
|
||||||
->name('dashboard');
|
->name('dashboard');
|
||||||
|
/*
|
||||||
|
* Meetup OSM
|
||||||
|
* */
|
||||||
|
Route::get('/meetup-osm/table', \App\Http\Livewire\Meetup\PrepareForBtcMapTable::class)
|
||||||
|
->name('osm.meetups')
|
||||||
|
->can('NovaAdminPolicy.viewAny');
|
||||||
|
Route::get('/meetup-osm/item/{meetup}', \App\Http\Livewire\Meetup\PrepareForBtcMapItem::class)
|
||||||
|
->name('osm.meetups.item')
|
||||||
|
->can('NovaAdminPolicy.viewAny');
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user