Node structure:

Node2D Script:
extends Node2D
func _ready() -> void:
$Area2D.connect("placed", $TileMap, "on_area2D_placed")
Area2D Script:
extends Area2D
signal placed(object)
onready var collision_shape = $CollisionShape2D
func _input(event: InputEvent) -> void:
if event.is_action_released("ui_accept"):
emit_signal("placed", self)
TileMap Script:
extends TileMap
func on_area2D_placed(obj:Area2D):
var radius_squared = pow(obj.collision_shape.shape.radius, 2)
var area_position = obj.position
var tiles_colliding = []
for tile in get_used_cells():
if map_to_world(tile).distance_squared_to(area_position) <= radius_squared:
tiles_colliding.append(tile)
print(tiles_colliding)
The Node2D just connects the signal between the two. The Area2D provides access to its collision shape (for calculations) and emits the placed
signal when you press enter, but this can be emitted at any time. The tile map iterates over all of its tiles and determines whether each tile is within the circle, if so it adds that tile to the tiles_colliding
array.
Tile tiles_colliding
array contains the map positions of all the tiles within your Area2D's circle. It is not as precise as the colored area you drew but it's the best you're going to get without doing annoying geometry to find the secant line between your tile map and circle and creating a polygon based on that. Using the tiles_colliding
array you can generate some kind of invisible object spawner object and place it in that tile.